在更新到 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))
输出 tibble 是正确的,但出现此消息:
summarise()``.groups按“年”重新组合输出(用参数覆盖)
summarise()``.groups
这应该如何解释?当我按年和周分组时,为什么它只报告按“年”重新分组?另外,覆盖是什么意思,我为什么要这样做?
我不认为该消息表明存在问题,因为它出现在整个 dplyr 小插图中: https ://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
谢谢!
这只是一个友好的警告信息。默认情况下,如果在 之前有任何分组summarise,它会删除一个组变量,即在 中指定的最后一个group_by。如果只有一个分组变量,则后面不会有任何分组属性summarise,如果有多个,即这里是两个,那么分组属性减少为1,即数据将具有“年份”作为分组属性。作为一个可重现的例子
summarise
group_by
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.
消息是它正在ungrouping ,即当有一个时group_by,它会在summarise
ungroup
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"
?summarise
.groups
"drop_last"
"drop"
"keep"
"rowwise"
.groups - 结果的分组结构。 “drop_last”:删除最后一级分组。这是 1.0.0 版之前唯一受支持的选项。 “drop”:所有级别的分组都被删除。 “keep”:与 .data 相同的分组结构。 “rowwise”:每一行都是它自己的组。 如果未指定 .groups,则当所有结果的大小为 1 时,您将获得“drop_last”,如果大小变化,您将获得“keep”。此外,除非选项“dplyr.summarise.inform”设置为 FALSE,否则会有一条消息通知您该选择。
.groups - 结果的分组结构。
“drop_last”:删除最后一级分组。这是 1.0.0 版之前唯一受支持的选项。
“drop”:所有级别的分组都被删除。
“keep”:与 .data 相同的分组结构。
“rowwise”:每一行都是它自己的组。
如果未指定 .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 执行 amutate或其他假设没有分组并导致意外输出的情况。现在,警告给用户一个指示,我们应该小心有一个分组属性
mutate
注意:.groups现在正处experimental于其生命周期中。因此,可以在未来的版本中修改行为
experimental
根据我们是否需要基于相同分组变量(或不需要)对数据进行任何转换,我们可以在.groups.