在 R dplyr 中,为什么我需要在计数()之后取消分组()?

in R dplyr why do I need to ungroup() after I count()?

当我第一次开始使用 R 编程时,我经常使用 dplyr count().

library(tidyverse)    
mtcars %>% count(cyl)

一旦我开始使用 apply 函数,我就开始 运行 遇到 count() 的问题。如果我只是将 ungroup() 添加到 count() 的末尾,问题就会消失。

我没有任何特定的可复制品可以展示。但是有人可以解释问题可能是什么,为什么 ungroup() 总是修复它,并且在之后始终使用 ungroup() 有什么缺点吗每 count(),或任何 group_by() 之后?当然,我假设我不再需要统计或汇总后的数据分组。

mtcars %>% count(cyl) %>% ungroup()

您过去 运行 遇到的问题来自 count() 的旧行为。 最高 dplyr 0.5.0,如果你这样做:

mtcars %>%
  count(cyl, wt)

结果仍将按 cyl 列分组。这意味着,例如,如果您在它后面加上类似 summarize(mean(am)) 的内容,您可能会为每个 cyl 获得一行,而您可能期望总共一行。如果您在计数后加上 %>% ungroup(),问题就会得到解决。

This behavior was changed in dplyr 0.7.0(2017 年 6 月发布),这样 count() 保留其输入的分组(意味着 mtcars %>% count(wt, cyl) 现在 returns 未分组 table ).这可能就是您不再能够重现问题的原因,这意味着您不再需要在 count().

之后执行 ungroup()

请注意,您可能仍需要在 group_by()summarize() 之后执行 ungroup()

mtcars %>%
  group_by(cyl, wt) %>%
  summarize(n = n())

returns 仍然按 cyl:

分组的小标题
# A tibble: 30 x 3
# Groups:   cyl [?]
     cyl    wt     n
   <dbl> <dbl> <int>
 1     4  1.51     1
 2     4  1.62     1
 3     4  1.84     1
 4     4  1.94     1
 5     4  2.14     1
 6     4  2.2      1
 7     4  2.32     1
 8     4  2.46     1
 9     4  2.78     1
10     4  3.15     1
# ... with 20 more rows