在R dplyr中为什么我需要在count()之后取消组合()?

sta*_*tor 10 group-by r lapply sapply dplyr

当我第一次开始在RI中编程时,通常会使用dplyr count().

library(tidyverse)    
mtcars %>% count(cyl)
Run Code Online (Sandbox Code Playgroud)

一旦我开始使用apply函数,我开始遇到count()的问题.如果我简单地将ungroup()添加到我的计数结束(),那么问题就会消失.

我没有任何特别的可复制品来展示.但有人可以解释问题可能是什么,为什么ungroup()总是修复它,并且在每次count()之后或者在任何group_by()之后一直使用ungroup()有任何缺点吗?当然,我假设我不再需要在计算或汇总后对数据进行分组.

mtcars %>% count(cyl) %>% ungroup()
Run Code Online (Sandbox Code Playgroud)

Dav*_*son 14

您曾经遇到过的问题来自于旧的行为count().高达dplyr 0.5.0,如果你这样做:

mtcars %>%
  count(cyl, wt)
Run Code Online (Sandbox Code Playgroud)

结果仍将按cyl列分组.这意味着,例如,如果您使用类似的东西summarize(mean(am)),那么cyl当您可能预期整行时,您将获得每行一行.如果您%>% ungroup()在计票之后放置,问题将得到解决.

此行为在dplyr 0.0.0.0(2017年6月发布)中已更改,因此count()保留了其输入的分组(意味着mtcars %>% count(wt, cyl)现在返回未分组的表).这可能就是为什么你不再能够重现这些问题的原因,这意味着你不再需要这样做ungroup()count().


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

mtcars %>%
  group_by(cyl, wt) %>%
  summarize(n = n())
Run Code Online (Sandbox Code Playgroud)

返回仍然按以下分组的tibble 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
Run Code Online (Sandbox Code Playgroud)