r语言 - 将 dplyr summarise_at 与列索引一起使用



我注意到,在提供列索引以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.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. 

@docendodiscimus感谢您指出这一点,因为即使此功能是故意的,文档也没有明确解释这一点,就我而言,可能是错误的源头。实际上,这个问题在回答另一个问题之前就已经解决了,我上面的评论以相同的逻辑正确解决了。


此时,可能的解决方案是提供名称而不是索引。但是仍然可以通过添加几个符号来使用索引.vars = names(.)[3:4],如下所示:

mtcars %>% 
group_by(cyl) %>% 
summarise_at( .vars = colnames(.)[3:4] , mean)
mtcars %>% 
group_by(cyl) %>% 
summarise_at( .vars = names(.)[3:4] , mean)

## A tibble: 3 x 3
#    cyl     disp        hp
#  <dbl>    <dbl>     <dbl>
#1     4 105.1364  82.63636
#2     6 183.3143 122.28571
#3     8 353.1000 209.21429

最新更新