dplyrメッセージ `summarise()`の再グループ化出力を 'x'で解釈する方法( `.groups`引数でオーバーライド)?


111

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ビネット全体に表示されるため、問題を示しているとは思いません:https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

dplyrを使用してpairwise.wilcox.testの出力を溶かす方法などのごく最近のSOの質問にのみ表示されているため、これは新しいメッセージだと思います。およびR複数の列に集約します(どちらも再グループ化/オーバーライドメッセージに対応していません)。

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


再現可能な例を作成してください。どのパッケージconvert()からですか?
DagHjermann20年

それはハブラーからです。添加することができる。
スージーDerkins

回答:


133

わかりやすい警告メッセージです。デフォルトでは、の前にグループ化がある場合、summarise1つのグループ変数、つまり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.

メッセージは、それがungroupingであるということです。つまり、単一の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より前にサポートされていた唯一のオプションでした。

「ドロップ」:すべてのレベルのグループ化がドロップされます。

"keep":。dataと同じグループ化構造。

「行ごと」:各行は独自のグループです。

.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

以前は、この警告は発行されておらずmutate、グループ化がないと仮定してOPが何かを実行し、予期しない出力が発生する可能性がありました。これで、警告により、グループ化属性があることに注意する必要があることがユーザーに示されます。

注:.groups現在experimental、ライフサイクルにあります。したがって、動作は将来のリリースで変更される可能性があります

同じグループ化変数に基づいてデータを変換する必要があるかどうか(または不要かどうか)に応じて、でさまざまなオプションを選択できます.groups


12
同様に役立つのは、このグループ化属性がまったく重要である理由を説明することです。これは明らかではないためです。
jangorecki

7
これは、.groups = 'drop'を使用する場合、case_whenやrowSumsなどの他の特定の関数を実行する前にungroup()を使用する必要がないことを意味しますか?
スージーダーキンス

8
@SusieDerkinsを使用している場合summarise、およびを使用している場合groups = 'drop'、グループ属性は存在しないため、その必要はありませんungroup(少なくとも現在のシナリオでは、この動作がtidyverseで変更されるまで)
akrun

49
ああ!メッセージ(旧「drop_last」デフォルトを維持)、オプション(dplyr.summarise.inform = F)を行う沈黙する
マイク・ローレンス

6
@MikeLawrenceありがとう!必要なのはそれだけです。以前に機能していたコードが突然警告をスローしているのは少し不快です(友好的な警告などはないはずです)。
ふわふわ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.