【问题标题】:Why does `summarize` drop a group?为什么 `summarize` 会删除一个组?
【发布时间】:2025-12-29 16:15:12
【问题描述】:

我在玩babynames pkg。 group_by 命令有效,但在 summarize 之后,其中一个组从组列表中删除。

library(babynames)
babynames[1:10000, ] %>% group_by(year, name) %>% head(1)

# A tibble: 1 x 5
# Groups:   year, name [1]
   year   sex  name     n       prop
  <dbl> <chr> <chr> <int>      <dbl>
1  1880     F  Mary  7065 0.07238433

这很好——两组,year, name。但是在汇总(正确尊重组)之后,name 组被删除。我错过了一个简单的错误吗?

babynames[1:10000, ] %>% 
    group_by(year, name) %>% 
    summarise(n = sum(n)) %>% head(1)

# A tibble: 1 x 3
# Groups:   year [1]
   year  name     n
  <dbl> <chr> <int>
1  1880 Aaron   102

更多信息,如果相关的话:

R version 3.4.0 (2017-04-21)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS  10.13.2
dplyr_0.7.4

【问题讨论】:

  • ?summarise: "一个分组级别将被删除。"。或者在the vignette 中更明确地说:“当您按多个变量分组时,每个摘要都会剥离一个分组级别。”
  • 在某种程度上,在汇总后删除变量是有意义的。总结后,您就已经缩小了分组变量的范围。换句话说,如果您检查sum(!duplicated(babynames[1:10000, c("name", "year")])),您将获得与您选择babynames[1:10000, ] %&gt;% group_by(year, name) %&gt;% summarise(n = sum(n)) 时获得的行数相同的值。换句话说,对于“唯一性”,您不需要该级别的多个列,这是我们通常在分组变量中看到的。
  • 当然,但是对于我之后执行的操作,我希望我的groupname,而不是year。所以为了避免我的错误,你必须知道(a)一个组将在汇总后被丢弃,(b)要丢弃的组是group_by调用中的最后一个组。这样做是有道理的,但它不会警告你它正在发生。
  • 最近有一个关于此主题的已关闭问题:dplyr::summarise removes a grouping variable 讨论了文档,但似乎得出的结论是文档还可以。我个人认为帮助文本可能更明确,例如关于删除分组变量的顺序。
  • 另一个讨论这种未记录的删除顺序的问题:data is still grouped after a summarize (but not by original set of columns):“这只是用户必须记住和混淆的另一个约定。”; "help(summarize) 表示“将删除一个分组级别”用户如何知道是哪一个?"

标签: r group-by dplyr summarize


【解决方案1】:

该行为已在文档中注明,请参阅 ?summarise Value 部分:

价值.data 属于同一类的对象。将删除一个分组级别。


相比之下,mutate不会删除任何分组级别:

:与.data 同类的对象。

【讨论】:

  • 记录了该行为,但没有回答问题(下降的原因是什么)。
  • Daang,我没有意识到。我想我一直假设所有的操作都尊重之前和之后的群体。
  • ^添加到那个。我认为“原因”是“bc Hadley 想要那样”。文档说“使逐步汇总数据集变得容易”,但它会按照您指定的顺序自动删除组,这是大多数人不会意识到的(除非您注意到代码中有错误或有在文档中看到该行)。以后我一定要多加注意。 ?
  • @Psidom 说清楚,我不是在批评你的回答,我只是说这仍然是一个悬而未决的问题。