在R的dplyr中,我为什么需要在count()之后使用ungroup()?

13

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

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

一旦我开始使用apply函数,我就开始遇到与count()有关的问题。如果在count()的末尾简单地添加ungroup(),问题就会消失。

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

mtcars %>% count(cyl) %>% ungroup()
1个回答

17
你曾经遇到的问题源于count()的旧行为。 在dplyr 0.5.0之前,如果你执行了以下操作:
mtcars %>%
  count(cyl, wt)

结果仍将按列进行分组。这意味着,例如,如果您跟随之类的内容,您将得到每个的一行,而您可能希望总共只有一行。如果在计数后放置<%>% ungroup(),则可以解决此问题。 从dplyr 0.7.0(于2017年6月发布)开始,此行为已更改,使count()保留其输入的分组(这意味着mtcars %>% count(wt, cyl)现在返回一个未分组的表)。这很可能是您无法再复制问题的原因,并且这意味着您不再需要在后执行。
请注意,在使用group_by()summarize()之后,您可能仍需要执行ungroup():
mtcars %>%
  group_by(cyl, wt) %>%
  summarize(n = n())

返回一个仍然以cyl为分组的tibble:

# 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

group_by(cyl, wt) 返回一个按 cyl wt 分组的 tibble。 - skoh
1
@skoh 每次调用 summarize 都会减少一个分组级别。请参见此处的第一个示例:https://dplyr.tidyverse.org/reference/summarise.html#examples - ba_ul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接