R语言group_by()下summarize()函数输出message

group_by()下使用summarize()函数输出如下message,意思是说summarize()的输出未分组。

r语言s4类型的summary函数输出 r语言 summarize_帮助文档

帮助文档

查看summarize()的帮助,发现确实有一个参数.groups,原文如下:

r语言s4类型的summary函数输出 r语言 summarize_Group_02


根据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