Wie interpretiere ich die dplyr-Nachricht `summate ()`, die die Ausgabe nach 'x' umgruppiert (überschreibe mit dem Argument` .groups`)?

94

Beim Ausführen von group_by und summary () nach dem Update auf die dplyr-Entwicklungsversion 0.8.99.9003 wurde eine neue Nachricht angezeigt (siehe Beitragstitel).

Hier ist ein Beispiel, um die Ausgabe neu zu erstellen:

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))

Das Ausgabetibble ist korrekt, aber diese Meldung wird angezeigt:

summarise()Umgruppierung der Ausgabe nach 'Jahr' (mit .groupsArgument überschreiben )

Wie ist das zu interpretieren? Warum wird eine Umgruppierung nur nach "Jahr" gemeldet, wenn ich nach Jahr und Woche gruppiert habe? Was bedeutet es auch zu überschreiben und warum sollte ich das tun wollen?

Ich glaube nicht, dass die Nachricht auf ein Problem hinweist, da sie in der gesamten dplyr-Vignette angezeigt wird: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

Ich glaube, es ist eine neue Nachricht, da sie nur bei sehr aktuellen SO-Fragen wie " Wie wird die Ausgabe paarweise geschmolzen? Wilcox.test mit dplyr?" und R Aggregieren über mehrere Spalten (von denen keine die Umgruppierungs- / Überschreibungsnachricht adressiert).

Vielen Dank!

Susie Derkins
quelle
Bitte machen Sie reproduzierbare Beispiele. Aus welchem ​​Paket stammt convert()?
Dag Hjermann
Es ist aus Hablar. Hinzufügen in.
Susie Derkins

Antworten:

114

Es ist nur eine freundliche Warnmeldung. Wenn vor dem eine Gruppierung vorhanden ist, wird standardmäßig summariseeine Gruppenvariable gelöscht, dh die zuletzt in der group_by. Wenn es nur eine Gruppierungsvariable gibt, gibt es kein Gruppierungsattribut nach dem summariseund wenn es mehr als ein gibt, dh hier sind es zwei, wird das Attribut für die Gruppierung auf 1 reduziert, dh die Daten hätten das 'Jahr' als Gruppierungsattribut. Als reproduzierbares Beispiel

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.

Die Nachricht ist, dass es ist, ungroupdh wenn es eine einzelne gibt group_by, wird diese Gruppierung nach dem gelöschtsummarise

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.

Hier wird die letzte Gruppierung gelöscht und mit dem 'am' neu gruppiert.

Wenn wir das überprüfen ?summarise, gibt es .groupsArgument , das standardmäßig ist "drop_last"und die anderen Optionen sind "drop", "keep","rowwise"

.groups - Gruppierungsstruktur des Ergebnisses.

"drop_last": Löscht die letzte Gruppierungsebene. Dies war die einzige unterstützte Option vor Version 1.0.0.

"drop": Alle Gruppierungsebenen werden gelöscht.

"keep": Gleiche Gruppierungsstruktur wie .data.

"rowwise": Jede Zeile ist eine eigene Gruppe.

Wenn .groups nicht angegeben ist, erhalten Sie entweder "drop_last", wenn alle Ergebnisse die Größe 1 haben, oder "keep", wenn die Größe variiert. Außerdem informiert Sie eine Nachricht über diese Auswahl, es sei denn, die Option "dplyr.summarise.inform" ist auf FALSE gesetzt.

das heißt , wenn wir die Änderung .groupsin summarise, bekommen wir nicht die Nachricht , da die Gruppenattribute entfernt werden

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

Bisher wurde diese Warnung nicht ausgegeben und kann zu Situationen führen, in denen das OP eine mutateoder eine andere Aktion ausführt, sofern keine Gruppierung vorliegt und eine unerwartete Ausgabe erfolgt. Die Warnung gibt dem Benutzer nun einen Hinweis darauf, dass wir darauf achten sollten, dass ein Gruppierungsattribut vorhanden ist

HINWEIS: Der Moment .groupsbefindet sich experimentalin seinem Lebenszyklus. Daher könnte das Verhalten in zukünftigen Versionen geändert werden

Abhängig davon, ob wir eine Transformation der Daten basierend auf derselben Gruppierungsvariablen benötigen (oder nicht), können wir die verschiedenen Optionen in auswählen .groups.

akrun
quelle
11
Es wäre auch nützlich zu erklären, warum dieses Gruppierungsattribut überhaupt wichtig ist, da es nicht offensichtlich ist.
Jangorecki
6
Bedeutet dies, dass Sie bei Verwendung von .groups = 'drop' nicht ungroup () verwenden müssen, bevor Sie bestimmte andere Funktionen wie case_when oder rowSums ausführen?
Susie Derkins
7
@SusieDerkins Wenn Sie summariseund mit verwenden groups = 'drop', sind die Gruppenattribute nicht vorhanden, sodass Sie dies nicht tun müssen ungroup(zumindest im aktuellen Szenario, bis dieses Verhalten in tidyverse geändert wird)
akrun
1
Irgendwelche Ratschläge zum globalen Festlegen des Gruppierungsverhaltens, damit ich es nicht manuell in meine Skripte eingeben muss, um zusätzliche Nachrichten zu vermeiden?
Mike Lawrence
37
Oh! Um die Nachricht zum Schweigen zu bringen (wobei die alte Standardeinstellung "drop_last" beibehalten wird), führen Sie Optionen aus (dplyr.summarise.inform = F)
Mike Lawrence