R语言group_by()下summarize()函数输出message
group_by()下使用summarize()函数输出如下message,意思是说summarize()的输出未分组。
帮助文档
查看summarize()
的帮助,发现确实有一个参数.groups
,原文如下:
根据summarize的参数提示,可以看到.groups
参数控制结果的分组结构,有四个可选的取值:"drop_last"时去掉最后一个分组变量;"drop"时去掉所有分组水平,此时没有组属性;"keep"时保持与.data
相同的分组结构; "rowwise"每一行自成一组。
当未指定.groups
参数时,会根据结果的行数自动选择,如果输出结果大小为1,就自动设定为"drop_last"; 如果输出结果大小不一,就自动设定为"keep".
分析
简单来说,如果参数.groups
没有设定,R就会输出这样一条message来提醒你对.groups
进行设定。我们需要告诉R,输出结果要如何设定组,否则R就会自动更改输出结果的组属性,然后给你一条message告诉你我已经改了。这条message其实就是提醒我们group_by()
下的summarize()
输出其实还有具有“group”属性。不过这条message不影响结果的输出,主要起一个提醒的作用。
下面来做一个实验,取不同的.groups
,更清楚地对比结果的异同。
(1) 不指定.groups
> trans_loan_lab %>% group_by(label) %>%
+ summarise(rmean = mean(rInternal),
+ fmean = mean(frequency),
+ mmean = mean(monetary))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 8 x 4
label rmean fmean mmean
<chr> <dbl> <dbl> <dbl>
1 一般保持客户 -26 9 102599
2 一般发展客户 -16.9 5.78 67715.
3 一般价值客户 -15.0 10.1 64330.
4 一般挽留客户 -85.4 2.48 22326.
5 重要保持客户 -36.8 10.7 267037.
6 重要发展客户 -18.0 6.12 139477.
7 重要价值客户 -9.96 11.8 282704.
8 重要挽留客户 -44.4 5.90 166351.
此时会输出message: summarise()
ungrouping output (override with .groups
argument),告诉我们summarise()输出是没有组属性的。
(2) .groups = "drop"
> trans_loan_lab %>% group_by(label) %>%
+ summarise(rmean = mean(rInternal),
+ fmean = mean(frequency),
+ mmean = mean(monetary), .groups= "drop")
# A tibble: 8 x 4
label rmean fmean mmean
<chr> <dbl> <dbl> <dbl>
1 一般保持客户 -26 9 102599
2 一般发展客户 -16.9 5.78 67715.
3 一般价值客户 -15.0 10.1 64330.
4 一般挽留客户 -85.4 2.48 22326.
5 重要保持客户 -36.8 10.7 267037.
6 重要发展客户 -18.0 6.12 139477.
7 重要价值客户 -9.96 11.8 282704.
8 重要挽留客户 -44.4 5.90 166351.
此时输出结果与(1)中相同,但是并没有输出message,因为我们已经指定在summarize后drop掉group属性。
(3) .group = "keep"
> trans_loan_lab %>% group_by(label) %>%
+ summarise(rmean = mean(rInternal),
+ fmean = mean(frequency),
+ mmean = mean(monetary), .groups= "keep")
# A tibble: 8 x 4
# Groups: label [8]
label rmean fmean mmean
<chr> <dbl> <dbl> <dbl>
1 一般保持客户 -26 9 102599
2 一般发展客户 -16.9 5.78 67715.
3 一般价值客户 -15.0 10.1 64330.
4 一般挽留客户 -85.4 2.48 22326.
5 重要保持客户 -36.8 10.7 267037.
6 重要发展客户 -18.0 6.12 139477.
7 重要价值客户 -9.96 11.8 282704.
8 重要挽留客户 -44.4 5.90 166351.
“keep”下保持与输入数据相同的分组结构,可以看到此时输出中就有组属性,第6行有# Groups: label [8]
。还可以直接查看属性:
> trans_loan_lab %>% group_by(label) %>%
+ summarise(rmean = mean(rInternal),
+ fmean = mean(frequency),
+ mmean = mean(monetary), .groups= "keep") %>% str()
tibble [8 x 4] (S3: grouped_df/tbl_df/tbl/data.frame)
$ label: chr [1:8] "一般保持客户" "一般发展客户" "一般价值客户" "一般挽留客户" ...
$ rmean: num [1:8] -26 -16.9 -15 -85.4 -36.8 ...
$ fmean: num [1:8] 9 5.78 10.13 2.48 10.7 ...
$ mmean: num [1:8] 102599 67715 64330 22326 267037 ...
- attr(*, "groups")= tibble [8 x 2] (S3: tbl_df/tbl/data.frame)
..$ label: chr [1:8] "一般保持客户" "一般发展客户" "一般价值客户" "一般挽留客户" ...
..$ .rows: list<int> [1:8]
.. ..$ : int 1
.. ..$ : int 2
.. ..$ : int 3
.. ..$ : int 4
.. ..$ : int 5
.. ..$ : int 6
.. ..$ : int 7
.. ..$ : int 8
.. ..@ ptype: int(0)
..- attr(*, ".drop")= logi TRUE
取消message
如果不想设定.groups
,可以取消message输出,设定
options(dplyr.summarise.inform = FALSE)
注意,这里不要写成summarize
,不然这条设定不起作用。
感兴趣也可以参考
【1】Stackoverflow