r - dplyr summarise() 和 summarise_each() 对提供的函数进行额外调用

标签 r dplyr

看来summarisesummarise_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

为什么会发生这种情况以及如何防止summarisesummarise_each从打那些额外的电话?

(这是使用 R 版本 3.3.0 和 dplyr 版本 0.5.0)

编辑:看来这个问题与 group_by 之间的相互作用有关。和 summarise/summarise_each .没有分组,就不会进行额外的调用。另外,mutatemutate_each不要遭受这个问题。 (信用:eddieipi10 这些发现)

最佳答案

尽管 dplyr 0.5.0(2016-06-24 发布)中仍然存在此问题,但已在 dplyr GitHub repro 中修复。已通过 this commit 修复于 2016-09-24 制作。我已经确认,当我在上一次提交中 checkout 和构建版本时,我可以重现该问题,但在从该版本或后续版本构建时无法重现。

(是的,在我找到它之前,我尝试了一大堆其他的。为什么我为了获得想象中的互联网积分而竭尽全力,我留给我的治疗师一个问题。:)

特别是在函数 SEXP process_data(const Data& gdf)inst/include/dplyr/Result/CallbackProcessor.h ,请注意以下更改:

  CLASS* obj = static_cast<CLASS*>(this);
  typename Data::group_iterator git = gdf.group_begin();

  RObject first_result = obj->process_chunk(*git);
  ++git; // This line was added


  for (int i = 1; i < ngroups; ++git, ++i) { // changed from starting at i = 0
    RObject chunk = obj->process_chunk(*git);

[评论由我添加,不是实际来源的一部分]

关于r - dplyr summarise() 和 summarise_each() 对提供的函数进行额外调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42470926/

相关文章:

r - 使用 dplyr 进行 eval 解析的替代方法

r - 如何在sf R包中按组测量空间点之间的距离

r - 查找 dplyr 中分组值之间的差异

根据条件返回列名

r - 根据组内另一列中的唯一值排列列中的值

r - 在 R 中生成向后的四分之一序列

r - 添加具有列名的列作为输入字符串

regex - 在 R 中修剪字符串

R 满足条件时按组排第一行

r - dplyr 返回每个组的全局平均值,而不是每个组的平均值