似乎summarise并且summarise_each正在对它们提供的回调函数进行不必要的额外调用.假设我们有以下内容
X <- data.frame( Group = rep(c("G1","G2"),2:3), Var1 = 1:5, Var2 = 11:15 )
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
Group Var1 Var2
1 G1 1 11
2 G1 2 12
3 G2 3 13
4 G2 4 14
5 G2 5 15
Run Code Online (Sandbox Code Playgroud)
进一步假设我们有(可能很昂贵的)功能
f <- function(v)
{
cat( "Calling f with vector", v, "\n" )
## ...additional bookkeeping and processing...
mean(v)
}
Run Code Online (Sandbox Code Playgroud)
我们想要应用于每个组中的每个变量.使用dplyr,我们可以通过以下方式进行:
X %>% group_by( Group ) %>% summarise_each( funs(f) )
Run Code Online (Sandbox Code Playgroud)
但是,输出显示fG1中每个变量都被称为一个额外的时间:
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
Run Code Online (Sandbox Code Playgroud)
使用时会出现同样的问题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
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?如何防止summarise和summarise_each进行这些额外的通话呢?
(这是使用R版本3.3.0和dplyr版本0.5.0)
编辑:似乎问题group_by与summarise/ 和/ 之间的相互作用有关summarise_each.没有分组,就不会进行额外的呼叫.此外,mutate并mutate_each没有遭受这个问题.(信用:eddi和eipi10这些调查结果)
尽管dplyr 0.5.0(2016-06-24发布)中仍然存在此问题,但它已在dplyr GitHub repro中修复.这是在2016-09-24上提交的.我已经确认,当我在上一次提交时签出并构建版本时,我可以重现该问题,但是在从该一个或后续版本构建时不能.
(是的,在我找到它之前,我尝试了很多其他的.为什么我会这么长,以期获得想象中的互联网积分,我作为一个问题留给我的治疗师.:)
特别是在函数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
Run Code Online (Sandbox Code Playgroud)
和
for (int i = 1; i < ngroups; ++git, ++i) { // changed from starting at i = 0
RObject chunk = obj->process_chunk(*git);
Run Code Online (Sandbox Code Playgroud)
[评论由我添加,不是实际来源的一部分]
| 归档时间: |
|
| 查看次数: |
595 次 |
| 最近记录: |