使用带有列索引的dplyr摘要_at

使用带有列索引的dplyr摘要_at,r,dplyr,R,Dplyr,我注意到,当在处向dplyr::summary\u提供列索引时,将确定要汇总的列,但不包括分组列。我想知道这是否是应该的,因为通过这种设计,使用正确的列索引取决于汇总列是位于分组列之前还是之后 下面是一个例子: library(dplyr) data("mtcars") # grouping column after summarise columns mtcars %>% group_by(gear) %>% summarise_at(3:4, mean) ## A tibble

我注意到,当在处向
dplyr::summary\u提供列索引时,将确定要汇总的列,但不包括分组列。我想知道这是否是应该的,因为通过这种设计,使用正确的列索引取决于汇总列是位于分组列之前还是之后

下面是一个例子:

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’
库(dplyr)
数据(“mtcars”)
#将列分组到摘要列之后
mtcars%>%按(档位)分组%>%总结(平均3:4)
##一个tibble:3x3
#齿轮传动马力
#          
#1     3 326.3000 176.1333
#2     4 123.0167  89.5000
#3     5 202.4800 195.6000
#在汇总列之前对列进行分组
mtcars%>%按(气缸)分组%>%总结(3:4,平均值)
##一个tibble:3x3
#气缸hp drat
#           
#1     4  82.63636 4.070909
#2     6 122.28571 3.585714
#3     8 209.21429 3.229286
#没有分组列
mtcars%>%汇总于(3:4,平均值)
#显示hp
#1 230.7219 146.6875
#实际第三列和第四列
名称(mtcars)[3:4]
#[1] 显示“hp”
包装版本(“dplyr”)
#[1] ‘0.7.2’
请注意汇总列是如何根据分组和分组列的位置而变化的


在其他平台上也是这样吗?这是一个bug还是一个功能?

@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
mtcars%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
汇总在(.vars=colnames(.)[3:4],平均值)
mtcars%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
汇总在(.vars=名称(.)[3:4],平均值)
##一个tibble:3x3
#气缸显示马力
#           
#1     4 105.1364  82.63636
#2     6 183.3143 122.28571
#3     8 353.1000 209.21429

版本为
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. 
库(dplyr)
mtcars%>%按(档位)分组%>%总结(平均3:4)
##tibble:3 x 3
#齿轮传动马力
#     
# 1     3  326. 176
# 2     4  123.  89.5
# 3     5  202. 196
mtcars%>%按(气缸)分组%>%总结(3:4,平均值)
##tibble:3 x 3
#气缸显示马力
#     
# 1     4  105.  82.6
# 2     6  183. 122
# 3     8  353. 209

似乎是有意的,因为
的summary_at
调用
tbl_nongroup_vars
,该函数在不分组变量的情况下获取TIBLE<代码>平均值
然后应用于该集合。@lukeA,感谢您的检查!我不得不说,如果我必须确定索引并减去前面的分组列数,我会觉得很不直观。与其使用
3:4
,不如使用
vars(disp:hp)
。例如:
mtcars%>%group\u by(cyl)%%>%summary\u at(vars(disp:hp),mean)
@MrFlick,是的,我同意,而且我几乎从未使用过索引选项。但由于它在那里,当我发现仍然有可能使用index
mtcars%%>%group\u by(cyl)%%>%summary\u at(.vars=colnames(.)[3:4],mean)
时,我感到惊讶。总之,@docendodiscimus感谢您指出这一点,因为即使此功能是故意的,文档也没有明确解释这一点,在我的情况下,这可能是错误的来源。但我在发行说明中找不到它发生的时间。。。是的,可能发生在切换到
tidyselect