如何解释dplyr消息`summarise()`通过'x'重新组合输出(用.groups参数覆盖)?


112

更新到dplyr开发版本0.8.99.9003后,在运行group_by和summarise()时,我开始收到一条新消息(请参阅帖子标题)。

这是重新创建输出的示例:

library(tidyverse)
library(hablar)
df <- read_csv("year, week, rat_house_females, rat_house_males, mouse_wild_females, mouse_wild_males 
               2018,10,1,1,1,1
               2018,10,1,1,1,1
               2018,11,2,2,2,2
               2018,11,2,2,2,2
               2019,10,3,3,3,3
               2019,10,3,3,3,3
               2019,11,4,4,4,4
               2019,11,4,4,4,4") %>% 
  convert(chr(year,week)) %>% 
  mutate(total_rodents = rowSums(select_if(., is.numeric))) %>% 
  convert(num(year,week)) %>% 
  group_by(year,week) %>% summarise(average = mean(total_rodents))

输出小标题正确,但是出现此消息:

summarise()按“年”重新组织输出(用.groups参数覆盖)

应该如何解释?当我按年和周分组时,为什么只报告按“年”重新分组?另外,覆盖是什么意思,为什么我要这么做?

我不认为该消息表明存在问题,因为它出现在整个dplyr小插图中:https ://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

我相信这是一条新消息,因为它仅出现在最近出现的SO问题中,例如如何使用dplyr融合pairwise.wilcox.test输出?R聚合在多个列上(都没有解决重组/覆盖消息)。

谢谢!


请举例说明。哪个包裹convert()来自?
达格·赫尔曼

是从哈勃拉尔来的。并称英寸
苏西Derkins

Answers:


137

这只是一个友好的警告消息。默认情况下,如果在之前有任何分组summarise,它将删除一个组变量,即在中指定的最后一个变量group_by。如果只有一个分组变量,则在后面将没有任何分组属性summarise;如果有多个,即这里是两个,那么分组属性将减少为1,即数据将具有“年”作为分组属性。作为可重现的例子

library(dplyr)
mtcars %>%
     group_by(am) %>% 
     summarise(mpg = sum(mpg))
#`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 2 x 2
#     am   mpg
#* <dbl> <dbl>
#1     0  326.
#2     1  317.

消息是它正在播放,ungroup即当有一个时group_by,它将在summarise

mtcars %>% 
   group_by(am, vs) %>% 
   summarise(mpg = sum(mpg))
#`summarise()` regrouping output by 'am' (override with `.groups` argument)
# A tibble: 4 x 3
# Groups:   am [2]
#     am    vs   mpg
#  <dbl> <dbl> <dbl>
#1     0     0  181.
#2     0     1  145.
#3     1     0  118.
#4     1     1  199.

在这里,它会丢弃最后的分组,并用“ am”重新分组

如果我们检查?summarise,有.groups参数,它在默认情况下是"drop_last"和其他选项"drop""keep""rowwise"

.groups-结果的分组结构。

“ drop_last”:删除最后一个分组级别。这是1.0.0版之前唯一受支持的选项。

“ drop”:删除所有级别的分组。

“ keep”:与.data相同的分组结构。

“行”:每行是它自己的组。

如果未指定.groups,则所有结果的大小均为1时将得到“ drop_last”;如果大小有所变化,则将得到“ keep”。此外,除非选项“ dplyr.summarise.inform”设置为FALSE,否则消息会通知您该选择。

即,如果我们更改.groupsin summarise,则不会收到消息,因为已删除组属性

mtcars %>% 
    group_by(am) %>%
    summarise(mpg = sum(mpg), .groups = 'drop')
# A tibble: 2 x 2
#     am   mpg
#* <dbl> <dbl>
#1     0  326.
#2     1  317.


mtcars %>%
   group_by(am, vs) %>%
   summarise(mpg = sum(mpg), .groups = 'drop')
# A tibble: 4 x 3
#     am    vs   mpg
#* <dbl> <dbl> <dbl>
#1     0     0  181.
#2     0     1  145.
#3     1     0  118.
#4     1     1  199.


mtcars %>% 
   group_by(am, vs) %>% 
   summarise(mpg = sum(mpg), .groups = 'drop') %>%
   str
#tibble [4 × 3] (S3: tbl_df/tbl/data.frame)
# $ am : num [1:4] 0 0 1 1
# $ vs : num [1:4] 0 1 0 1
# $ mpg: num [1:4] 181 145 118 199

以前,没有发出此警告,并且可能导致OP进行mutate某种操作(假设没有分组并导致意外输出)。现在,该警告为用户提供了一个指示,即我们应注意存在分组属性

注意:.groups现在是experimental生命周期。因此,该行为可以在将来的版本中进行修改

根据我们是否需要基于同一分组变量对数据进行任何转换(或不需要),我们可以在中选择不同的选项.groups


12
同样有用的是解释为什么这个分组属性根本不重要,因为它并不明显。
jangorecki

7
这是否意味着如果您使用.groups ='drop',则在运行某些其他功能(例如case_when或rowSums)之前不必使用ungroup()吗?
Susie Derkins

8
@SusieDerkins如果您使用summarise,和和groups = 'drop',则组属性不存在,因此您不需要ungroup(至少在当前情况下,直到在tidyverse中更改此行为之前)
akrun

49
哦! 要使消息静音(保留旧的“ drop_last”默认值),请执行options(dplyr.summarise.inform = F)
Mike Lawrence

6
@MikeLawrence谢谢!这就是我所需要的。以前工作的代码突然抛出警告有点不对劲(应该没有友好的警告之类的东西)。
蓬松的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.