dplyr:使用poly函数生成多项式系数

3
我希望能够将多项式系数添加到数据框中,就像下面的示例一样:
df1 <- 
  structure(list(
    Y = c(4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 16, 16, 16, 
          16, 16, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 16, 
          16, 16, 16, 16, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 8, 8, 8, 8, 
          8, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32)), 
    class = "data.frame", row.names = c(NA, -60L))

library(tidyverse)
df1 %>%
  dplyr::mutate(
    Linear    = poly(x = Y, degree = 3, raw = TRUE)[ ,1]
  , Quadratic = poly(x = Y, degree = 3, raw = TRUE)[ ,2]  
  , Cubic     = poly(x = Y, degree = 3, raw = TRUE)[ ,3]
    )

我想知道是否有像这样简洁的方法
df1 %>%
  dplyr::mutate(poly(x = Y, degree = 3, raw = TRUE))

谢谢

2个回答

9

虽然不是完全符合您的期望,但已经足够接近了。我首先将 poly 的输出(一个矩阵)转换为数据框,然后使用 !!! 拼接列(将列表/数据框的每个元素转换为它自己的参数)。setNames 可选用于重命名列:

library(dplyr)

df1 %>%
  mutate(!!!as.data.frame(poly(x = .$Y, degree = 3, raw = TRUE))) %>%
  setNames(c("Y", "Linear", "Quadratic", "Cubic"))

结果:

    Y Linear Quadratic Cubic
1   4      4        16    64
2   4      4        16    64
3   4      4        16    64
4   4      4        16    64
5   4      4        16    64
6   8      8        64   512
7   8      8        64   512
8   8      8        64   512
9   8      8        64   512
10  8      8        64   512
11 16     16       256  4096
12 16     16       256  4096
13 16     16       256  4096
14 16     16       256  4096
15 16     16       256  4096
16 32     32      1024 32768
17 32     32      1024 32768
18 32     32      1024 32768
19 32     32      1024 32768
20 32     32      1024 32768
...

在这里了解关于 !!! 的信息(https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html),我以前从未见过。在页面的2/3处。 - zack
2
@zack 这是一个相当新的编程生态系统的一部分,使用dplyr与其他“tidyverse”函数配合良好。还要检查“rlang”。 - acylam

2

另一个选项,虽然我非常喜欢@useR的解决方案:

df1 %>%
  left_join(data.frame(Y = unique(.$Y), poly(unique(.$Y), degree = 3, raw = TRUE)),
            by = c('Y' = 'Y')) %>% 
  setNames(c('Y', 'Linear', 'Quadratic', 'Cubic'))

    Y Linear Quadratic Cubic
1   4      4        16    64
2   4      4        16    64
3   4      4        16    64
4   4      4        16    64
5   4      4        16    64
6   8      8        64   512
7   8      8        64   512
8   8      8        64   512
9   8      8        64   512
10  8      8        64   512
11 16     16       256  4096
12 16     16       256  4096
13 16     16       256  4096
14 16     16       256  4096
15 16     16       256  4096
16 32     32      1024 32768
17 32     32      1024 32768
18 32     32      1024 32768
19 32     32      1024 32768
20 32     32      1024 32768

不需要 by = c('Y' = 'Y'),因为它是唯一的共同列。 - acylam
1
没错,我已经养成了习惯,在我的代码中始终包括双方,因为我发现这样可以使代码更易读。不过,指出这一点仍然是一件好事。 - zack
你也可以只写成 by = 'Y',因为它们的名称相同,但是保持一致性的观点我理解。 - acylam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接