【发布时间】:2017-01-07 06:51:19
【问题描述】:
似乎summarise 和summarise_each 对它们提供的回调函数进行了不必要的额外调用。假设我们有以下
X <- data.frame( Group = rep(c("G1","G2"),2:3), Var1 = 1:5, Var2 = 11:15 )
看起来像这样:
Group Var1 Var2
1 G1 1 11
2 G1 2 12
3 G2 3 13
4 G2 4 14
5 G2 5 15
进一步假设我们有一个(可能很昂贵的)函数
f <- function(v)
{
cat( "Calling f with vector", v, "\n" )
## ...additional bookkeeping and processing...
mean(v)
}
我们希望将其应用于每个组中的每个变量。使用dplyr,我们可以通过以下方式进行:
X %>% group_by( Group ) %>% summarise_each( funs(f) )
但是,输出显示 f 为 G1 中的每个变量额外调用了一次:
Calling f with vector 1 2
Calling f with vector 1 2
Calling f with vector 3 4 5
Calling f with vector 11 12
Calling f with vector 11 12
Calling f with vector 13 14 15
# A tibble: 2 x 3
Group Var1 Var2
<fctr> <dbl> <dbl>
1 G1 1.5 11.5
2 G2 4.0 14.0
使用summarize时也会出现同样的问题:
> X %>% group_by( Group ) %>% summarise( test = f(Var1) )
Calling f with vector 1 2
Calling f with vector 1 2
Calling f with vector 3 4 5
# A tibble: 2 × 2
Group test
<fctr> <dbl>
1 G1 1.5
2 G2 4.0
为什么会发生这种情况?如何防止summarise 和summarise_each 拨打这些额外电话?
(这是使用R 3.3.0 版和dplyr 0.5.0 版)
编辑:看来问题与group_by 和summarise/summarise_each 之间的相互作用有关。没有分组,就不会进行额外的调用。此外,mutate 和 mutate_each 不会遇到此问题。 (信用:eddi 和 eipi10 这些发现)
【问题讨论】:
-
您可以进一步缩小范围 - 问题在于
summarise(和group_by) -
mutate和mutate_each不会出现此错误(与group_by一起使用时) -
但是如果你先group_by然后mutate或者mutate_each,就没有额外的函数调用了,所以看起来和summarise/summarise_each有关,但是只有在使用group_by的时候才可以
-
代码是here,但我无法完全解析发生了什么。我认为每个变量的额外调用可能是它试图弄清楚它是否可以在 C/C++ 中做更多的结果,但这是一个猜测。
-
还有一个解决方法:
purrr::dmap没有这个问题并且尊重分组:X %>% group_by(Group) %>% purrr::dmap(f)