首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解释dplyr消息` output ()‘用'x’重新分组输出(用`.groups`参数覆盖)?

如何解释dplyr消息` output ()‘用'x’重新分组输出(用`.groups`参数覆盖)?
EN

Stack Overflow用户
提问于 2020-06-01 20:26:57
回答 5查看 149.4K关注 0票数 192

在运行group_by时,我开始收到一条新消息(请参阅post标题),并在更新到dplyr开发版本0.8.99.9003后进行总结()。

下面是一个重新创建输出的示例:

代码语言:javascript
运行
复制
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参数覆盖)

这应如何解释?为什么在我按年度和每周分组时,它只按“年份”进行重组?另外,覆盖意味着什么?我为什么要这样做?

我不认为这条消息表明了问题,因为它出现在dplyr vignette:https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

我认为这是一条新消息,因为它只出现在最近的问题上,比如How to melt pairwise.wilcox.test output using dplyr?R Aggregate over multiple columns (这两个问题都没有解决重组/重写消息)。

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-06-01 20:41:18

这只是一个友好的警告信息。默认情况下,如果在summarise之前有任何分组,它会删除一个组变量,即在group_by中指定的最后一个变量。如果只有一个分组变量,那么在summarise之后就不会有任何分组属性,而且如果有多个分组属性(这里是两个),那么分组的属性将减少到1,即数据将具有‘more’作为分组属性。作为一个可复制的例子

代码语言:javascript
运行
复制
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之后删除该分组。

代码语言:javascript
运行
复制
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版本之前唯一受支持的选项。

“下降”:所有级别的分组都被删除。

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

“行”:每一行都是自己的组。

当没有指定.groups时,当所有结果都是1大小时,要么得到"drop_last“,要么在大小变化时得到”drop_last“。此外,除非选项"dplyr.summarise.inform“设置为FALSE,否则消息会通知您该选项。

也就是说,如果我们在.groups中更改summarise,则不会得到消息,因为组属性将被删除

代码语言:javascript
运行
复制
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中选择不同的选项。

票数 246
EN

Stack Overflow用户

发布于 2021-09-30 13:18:20

套用公认的答案,这只是一个友好的、令人困惑的警告。

summarise()已将输出按“xxx”分组

应该读取:输出是OK的,并包含所有分组列作为属性,只有分组键可能受到限制。

mtcars计算cyl, ammean(mpg)进行分组的实例

代码语言:javascript
运行
复制
mtcars %>% group_by(cyl, am) %>% summarise(avg_mpg = mean(mpg))
`summarise()` has grouped output by 'cyl'. You can override using the `.groups` argument.
# A tibble: 6 x 3
# Groups:   cyl [3]
    cyl    am avg_mpg
  <dbl> <dbl>   <dbl>
1     4     0    22.9
2     4     1    28.1
3     6     0    19.1
4     6     1    20.6
5     8     0    15.0
6     8     1    15.4

警告是说,在输出中,使用默认的.groups = "drop_last"只保留了原始分组键中的第一个。请看行# Groups: cyl [3]

然而,属性是完整的,cylam都是定义的。

这里简要介绍了可用选项,它显示了函数group_keys()的结果

代码语言:javascript
运行
复制
mtcars %>% group_by(cyl, am) %>% summarise(avg_mpg = mean(mpg)) %>% group_keys() 
`summarise()` has grouped output by 'cyl'. You can override using the `.groups` argument.
# A tibble: 3 x 1
    cyl
  <dbl>
1     4
2     6
3     8

mtcars %>% group_by(cyl, am) %>% summarise(avg_mpg = mean(mpg), .groups = "keep") %>% group_keys() 
# A tibble: 6 x 2
    cyl    am
  <dbl> <dbl>
1     4     0
2     4     1
3     6     0
4     6     1
5     8     0
6     8     1

mtcars %>% group_by(cyl, am) %>% summarise(avg_mpg = mean(mpg), .groups = "drop") %>% group_keys() 
# A tibble: 1 x 0

唯一可见的结果是在使用级联摘要时--下面的示例在删除组键时只生成一个汇总行。

代码语言:javascript
运行
复制
mtcars %>% group_by(cyl, am) %>% summarise(avg_mpg = mean(mpg), .groups = "drop") %>% summarise(min_avg_mpg = min(avg_mpg))
# A tibble: 1 x 1
  min_avg_mpg
        <dbl>
1   15.0

但是,由于分组属性都是可用的,因此在随后的总结之前使用group_by(cyl, am)重置组键应该不是问题。

票数 9
EN

Stack Overflow用户

发布于 2021-02-23 23:06:41

答案在“?摘要”中解释:“当未指定.groups时,根据结果的行数选择它:如果所有结果都有一行,则得到"drop_last”。如果行数不同,则得到“保持”。

基本上,当有多个选项可用作.groups=参数时,就会得到这样的消息。该消息警告您,在按照上述条件计算统计数据时使用了一个选项:"drop_last“或”rows“,分别用于1行或多行的结果。假设由于某种原因,在管道中应用了两个或多个分组条件,但仍然需要对所有值进行汇总,而不考虑分组,这可以通过设置.group = 'drop‘来完成。不幸的是,这只是理论上的,因为正如您在@akrun的示例中所看到的,无论在.group=中设置了哪个选项,统计值都保持不变(我将这些不同的选项应用于我的数据集之一,得到了相同的结果和相同的数据结构(‘分组结构由.group=参数控制……’)。但是,通过指定参数.group,不会输出任何消息。

底线是,当使用汇总时,如果不使用分组标准,则对所有行计算输出统计量,因此“结果有1行”。当使用一个或多个分组标准时,在每个组内计算输出统计量,因此“行数随数据帧中组数的不同而变化”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62140483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档