我想对带有使用附加变量的函数对象的列集合使用dplyr::summarise_at
。
例如,考虑以下带有两个数字变量和一个指标的数据框。
library(dplyr, warn.conflicts = FALSE)
t1 <- data.frame(lg = c(TRUE, FALSE, TRUE, FALSE),
x1 = 1:4,
x2 = 5:8)
在dplyr::funs()
内部使用summarise_at
可以做到:
t1 %>% summarise_at(c("x1", "x2"), funs(mean(. * lg)))
#> x1 x2
#> 1 1 3
但是,我更喜欢将function
对象传递给summarise_at
-而不是调用dplyr::funs()
-这样R CMD Check
不会抱怨未知变量{{ 1}}。
不幸的是,当我尝试执行此操作时,.
找不到指标变量summarise_at
。
lg
因此,是否可以通过这种方法将功能对象内部带有额外变量的功能对象传递给t1 %>% summarise_at(c("x1", "x2"), function(x) mean(x * lg))
#> Error in summarise_impl(.data, dots): Evaluation error: object 'lg' not found.
?
答案 0 :(得分:1)
如果在funs
中不使用list
或summarize_at()
,我认为不可能做到这一点。我的猜测是,当我们使用波浪号~
和.
/ .x
或类似的function(x)
和x
时,它会使用自己的环境创建一个匿名函数。因此,它仅知道通过.
或.x
传递的列变量,但不知道数据帧中的其他变量,即lg
。而当我们添加funs()
或list()
时,它可能继承了整个环境,这使它知道数据帧中的每一列,而不仅仅是通过.
如果您想要更清晰的代码,也许编写一个函数然后在summarise_at()
内调用它?
multiplyx <- function(x, lg){
result <- mean(x * lg)
return(result)
}
t1 %>% summarise_at(c("x1", "x2"), funs(multiplyx(., lg)))
#> x1 x2
#> 1 1 3
t1 %>% summarise_at(c("x1", "x2"), list(~ multiplyx(., lg)))
#> x1 x2
#> 1 1 3
另请参阅this