1. ホーム
  2. r

[解決済み] dplyr のメッセージ `summarise()` が 'x' で再グループ化された出力を解釈するにはどうしたらいいですか (`.groups` 引数で上書き)?

2022-04-21 18:58:10

質問

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 vignette全体に表示されるので、問題を示しているとは思えません。 https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

など、ごく最近のSOの質問でしか出てこないので、新しいメッセージだと思います。 dplyrを使ってpairwise.wilcox.testの出力を溶かすには? そして R 複数列の集計 (どちらも再グループ化/上書きメッセージには対応していません)。

ありがとうございました。

解決方法は?

これは単なる親切な警告メッセージです。 デフォルトでは、もしグループ化の前に summarise で指定された最後のグループ変数を削除します。 group_by . グループ化変数が1つしかない場合、グループ化属性は summarise もし、2つ以上ある場合は、グループ化のための属性は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と同じグループ化構造。

"rowise"。各行が独立したグループとなる。

.groupsが指定されていない場合、すべての結果がサイズ1の場合は"drop_last"、サイズが異なる場合は"keep"のいずれかが表示されます。さらに、"dplyr.summarise.inform"オプションがFALSEに設定されていない限り、その選択を通知するメッセージが表示されます。

を変更した場合 .groupssummarise というメッセージが表示されますが、グループ属性が削除されているため、メッセージは表示されません。

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 .