我注意到,在向dplyr::summarize_at
提供列索引时,确定要汇总的列,不包括分组列。我想知道这是不是因为这个设计,使用正确的列索引取决于汇总列是在分组列之前还是之后定位。
以下是一个例子:
library(dplyr)
data("mtcars")
# grouping column after summarise columns
mtcars %>% group_by(gear) %>% summarise_at(3:4, mean)
## A tibble: 3 x 3
# gear disp hp
# <dbl> <dbl> <dbl>
#1 3 326.3000 176.1333
#2 4 123.0167 89.5000
#3 5 202.4800 195.6000
# grouping columns before summarise columns
mtcars %>% group_by(cyl) %>% summarise_at(3:4, mean)
## A tibble: 3 x 3
# cyl hp drat
# <dbl> <dbl> <dbl>
#1 4 82.63636 4.070909
#2 6 122.28571 3.585714
#3 8 209.21429 3.229286
# no grouping columns
mtcars %>% summarise_at(3:4, mean)
# disp hp
#1 230.7219 146.6875
# actual third & fourth columns
names(mtcars)[3:4]
#[1] "disp" "hp"
packageVersion("dplyr")
#[1] ‘0.7.2’
注意汇总列如何根据分组列的分组和位置而变化。
其他平台上是否相同?这是一个错误还是一个功能?
答案 0 :(得分:2)
@docendodiscimus感谢您指出这一点,因为即使此功能是故意的,文档也没有明确解释这一点,在我的情况下可能是错误的来源。实际上,这个问题在回答other question之前已经解决了,我上面的评论用相同的逻辑正确地做了。
此时,可能的解决方案是提供名称而不是索引。但是仍然可以通过添加少量符号times()
来使用索引,如下所示:
.vars = names(.)[3:4]
答案 1 :(得分:2)
版本为0.7.5
的行为无法再出现:
library(dplyr)
mtcars %>% group_by(gear) %>% summarise_at(3:4, mean)
# # A tibble: 3 x 3
# gear disp hp
# <dbl> <dbl> <dbl>
# 1 3 326. 176.
# 2 4 123. 89.5
# 3 5 202. 196.
mtcars %>% group_by(cyl) %>% summarise_at(3:4, mean)
# # A tibble: 3 x 3
# cyl disp hp
# <dbl> <dbl> <dbl>
# 1 4 105. 82.6
# 2 6 183. 122.
# 3 8 353. 209.