【问题标题】:Using dplyr summarise_at with column index将 dplyr summarise_at 与列索引一起使用
【发布时间】:2018-02-03 15:05:24
【问题描述】:

我注意到,在向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’

请注意汇总列如何根据分组列的分组和位置而变化。

在其他平台上也一样吗?是错误还是功能?

【问题讨论】:

  • 似乎是有意的,因为summarise_at 调用tbl_nongroup_vars,它在不分组变量的情况下获取小标题。然后将mean 应用于该集合。
  • @lukeA,感谢您查看!我不得不说,如果我必须确定索引并减去它们之前的分组列数,这对我来说感觉非常违反直觉。
  • 与其使用3:4,不如使用vars(disp:hp) 更安全。例如:mtcars %&gt;% group_by(cyl) %&gt;% summarise_at(vars(disp:hp), mean)
  • @MrFlick,是的,我同意,而且我几乎从未使用过索引选项。但既然它在那里,当我发现它时我很惊讶
  • 仍有可能使用索引mtcars %&gt;% group_by(cyl) %&gt;% summarise_at(.vars = colnames(.)[3:4] , mean)。无论如何,@docendodiscimus 感谢您指出这一点,因为即使此功能是故意的,文档也没有明确解释这一点,在我的情况下可能是错误的来源。

标签: r dplyr


【解决方案1】:

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. 

【讨论】:

【解决方案2】:

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


此时,可能的解决方案是提供名称而不是索引。但是仍然可以通过添加几个符号.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

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2018-04-09
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多