dplyr summarise_at在函数对象内找不到额外的变量

时间:2018-10-31 23:37:27

标签: r dplyr

我想对带有使用附加变量的函数对象的列集合使用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.

1 个答案:

答案 0 :(得分:1)

如果在funs中不使用listsummarize_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