Bagaimana menafsirkan pesan dplyr `summarize ()` mengelompokkan kembali keluaran dengan 'x' (menimpa dengan argumen `.groups`)?

95

Saya mulai mendapatkan pesan baru (lihat judul posting) ketika menjalankan group_by dan meringkas () setelah memperbarui ke versi pengembangan dplyr 0.8.99.9003.

Berikut adalah contoh untuk membuat ulang output:

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

Tibble keluaran benar, tetapi pesan ini muncul:

summarise()pengelompokan ulang keluaran dengan 'tahun' (timpa dengan .groupsargumen)

Bagaimana ini harus ditafsirkan? Mengapa laporan pengelompokan ulang hanya berdasarkan 'tahun' ketika saya dikelompokkan berdasarkan tahun dan minggu? Selain itu, apa artinya menimpa dan mengapa saya ingin melakukannya?

Saya rasa pesan tersebut tidak menunjukkan masalah karena muncul di seluruh sketsa dplyr: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

Saya percaya ini adalah pesan baru karena hanya muncul pada pertanyaan SO terbaru seperti Bagaimana cara mencairkan keluaran pairwise.wilcox.test menggunakan dplyr? dan R Mengagregasi di beberapa kolom (tidak ada yang membahas pesan pengelompokan ulang / penggantian).

Terima kasih!

Susie Derkins
sumber
Harap buat contoh yang dapat direproduksi. Paket yang convert()dari?
Dag Hjermann
Ini dari hablar. Menambahkannya.
Susie Derkins

Jawaban:

115

Itu hanya pesan peringatan yang ramah. Secara default, jika ada pengelompokan sebelum summarise, itu menjatuhkan satu variabel grup yaitu yang terakhir ditentukan di group_by. Jika hanya ada satu variabel pengelompokan, tidak akan ada atribut pengelompokan setelah summarisedan jika ada lebih dari satu yaitu di sini ada dua, jadi atribut untuk pengelompokan dikurangi menjadi 1 yaitu data akan memiliki 'tahun' sebagai atribut pengelompokan. Sebagai contoh yang dapat direproduksi

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.

Pesannya adalah bahwa itu adalah ungroupketika ada satu group_by, itu menjatuhkan pengelompokan itu setelahsummarise

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.

Di sini, itu menghilangkan pengelompokan terakhir dan berkumpul kembali dengan 'am'

Jika kita memeriksa ?summarise, ada .groupsargumen yang secara default adalah "drop_last"dan pilihan lain "drop", "keep","rowwise"

.groups - Struktur pengelompokan hasil.

"drop_last": menghapus tingkat pengelompokan terakhir. Ini adalah satu-satunya opsi yang didukung sebelum versi 1.0.0.

"drop": Semua tingkat pengelompokan dihentikan.

"keep": Struktur pengelompokan yang sama seperti .data.

"rowwise": Setiap baris adalah grupnya sendiri.

Jika .groups tidak ditentukan, Anda akan mendapatkan "drop_last" jika semua hasil berukuran 1, atau "keep" jika ukurannya bervariasi. Selain itu, sebuah pesan memberi tahu Anda tentang pilihan itu, kecuali opsi "dplyr.summarise.inform" disetel ke FALSE.

yaitu jika kita mengubah .groupsin summarise, kita tidak mendapatkan pesan karena atribut grup dihapus

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

Sebelumnya, peringatan ini tidak dikeluarkan dan dapat mengarah pada situasi di mana OP melakukan mutateatau hal lain dengan asumsi tidak ada pengelompokan dan menghasilkan output yang tidak diharapkan. Sekarang, peringatan memberikan indikasi kepada pengguna bahwa kita harus berhati-hati bahwa ada atribut pengelompokan

CATATAN: Saat .groupsini experimentaldalam siklus hidupnya. Jadi, perilaku tersebut dapat dimodifikasi di rilis mendatang

Bergantung pada apakah kita memerlukan transformasi data berdasarkan variabel pengelompokan yang sama (atau tidak diperlukan), kita dapat memilih opsi yang berbeda di .groups.

akrun
sumber
11
Yang akan berguna juga adalah menjelaskan mengapa atribut pengelompokan ini penting, karena tidak jelas.
jangorecki
6
Apakah ini berarti bahwa jika Anda menggunakan .groups = 'drop' Anda tidak perlu menggunakan ungroup () sebelum menjalankan fungsi tertentu lainnya seperti case_when atau rowSums?
Susie Derkins
7
@SusieDerkins Jika Anda menggunakan summarise, dan dengan groups = 'drop', maka atribut grup tidak ada, jadi Anda tidak perlu ungroup(setidaknya dalam skenario saat ini sampai perilaku ini diubah secara tidyverse)
akrun
1
Adakah saran tentang cara mengatur perilaku pengelompokan secara global sehingga saya tidak perlu memasukkannya secara manual di seluruh skrip saya untuk menghindari pesan tambahan?
Mike Lawrence
37
Oh! untuk membungkam pesan (mempertahankan default "drop_last" yang lama), lakukan opsi (dplyr.summarise.inform = F)
Mike Lawrence