Zacząłem otrzymywać nową wiadomość (patrz tytuł posta) podczas uruchamiania group_by i summarize () po aktualizacji do wersji rozwojowej dplyr 0.8.99.9003.
Oto przykład odtworzenia wyniku:
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))
Plik wyjściowy jest poprawny, ale pojawia się ten komunikat:
summarise()
przegrupowanie wyjścia według „roku” (nadpisanie.groups
argumentem)
Jak należy to interpretować? Dlaczego zgłasza przegrupowanie tylko według „roku”, kiedy grupuję według roku i tygodnia? Co to znaczy przesłonić i dlaczego miałbym to robić?
Nie sądzę, że komunikat wskazuje na problem, ponieważ pojawia się w winiecie dplyr: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
Uważam, że jest to nowa wiadomość, ponieważ pojawiła się tylko w niedawnych pytaniach SO, takich jak Jak stopić wyjście pairwise.wilcox.test używając dplyr? i R Agregują w wielu kolumnach (z których żadna nie dotyczy komunikatu przegrupowania / zastąpienia).
Dziękuję Ci!
convert()
?Odpowiedzi:
To tylko przyjazna wiadomość ostrzegawcza. Domyślnie, jeśli istnieje jakiekolwiek grupowanie przed
summarise
, usuwa jedną zmienną grupową, tj. Ostatnią określoną wgroup_by
. Jeśli istnieje tylko jedna zmienna grupująca, nie będzie żadnego atrybutu grupującego po znaku,summarise
a jeśli jest ich więcej niż jedna, czyli tutaj są dwa, więc atrybut grupujący jest redukowany do 1, tj. Dane miałyby „rok” jako atrybut grupujący. Jako powtarzalny przykładlibrary(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.
Komunikat jest taki, że jest to,
ungroup
tj. Kiedy jest pojedynczygroup_by
, to porzuca to zgrupowanie posummarise
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.
Tutaj porzuca ostatnie grupowanie i przegrupowuje się z „am”
Jeśli możemy sprawdzić
?summarise
, istnieje.groups
argument, który jest domyślnie"drop_last"
, a pozostałe opcje są"drop"
,"keep"
,"rowwise"
tzn. jeśli zmienimy
.groups
insummarise
, nie otrzymamy komunikatu, ponieważ atrybuty grupy są usuniętemtcars %>% 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
Wcześniej to ostrzeżenie nie zostało wydane i może prowadzić do sytuacji, w których PO robi
mutate
coś innego, zakładając, że nie ma grupowania i skutkuje nieoczekiwanymi wynikami. Teraz ostrzeżenie daje użytkownikowi wskazówkę, że powinniśmy uważać, jeśli istnieje atrybut grupowaniaUWAGA:
.groups
Obecnie trwaexperimental
cykl życia. Tak więc zachowanie może zostać zmodyfikowane w przyszłych wersjachW zależności od tego, czy potrzebujemy jakiejkolwiek transformacji danych na podstawie tej samej zmiennej grupującej (lub niepotrzebnej), możemy wybrać różne opcje w
.groups
.źródło
summarise
i zgroups = 'drop'
, nie ma atrybutów grupowych, więc nie musiszungroup
(przynajmniej w obecnym scenariuszu, dopóki to zachowanie nie zostanie zmienione w tidyverse)