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_bysummarise / summarise_each之间的相互作用有关。如果没有分组,则不会进行额外的 call 。此外,mutatemutate_each不受此问题的影响。 (对于这些发现,信誉:eddieipi10)

最佳答案

尽管此问题在dplyr 0.5.0(发布于2016-06-24)中仍然存在,但已在dplyr GitHub repro中修复。它在2016-09-24用this commit修复。我已经确认,当我在上次提交时结帐并构建版本时,可以重现该问题,但是在该版本或后续版本中进行构建时,则不能。

(是的,在找到它之前,我尝试了很多其他方法。为什么要竭尽全力希望获得想象中的互联网积分,我还是向治疗师提一个问题。)

特别是,在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/39236759/

相关文章:

r - R 函数必须在 tidyverse 的 mutate 函数中使用什么参数?

r - 如何针对大型数据表优化 R 中的 for 循环

r - 在日期序列中查找月份的最后一天

r - 在下一个 mutate_at 中选择由 mutate_at 创建的正确列

r - 如果列名迄今为止包含 'dat',则进行变异

为 R 中数据框的每一行返回缺少 (NA) 数据的列名列表

R:无法安装 AzureML 包(R 版本 3.3.3)

python - 从一个表中提取小时值并在另一个表中填充一小时增量的 "buckets"的函数

r - 使用 gsub 转换模式

r - 在公式/字符串中的任意数量的函数周围添加 "'