Làm thế nào để diễn giải thông báo dplyr `summon ()` tái nhóm đầu ra theo 'x' (ghi đè bằng đối số `.groups`)?


97

Tôi bắt đầu nhận được thông báo mới (xem tiêu đề bài đăng) khi chạy group_by và tóm tắt () sau khi cập nhật lên phiên bản phát triển dplyr 0.8.99.9003.

Đây là một ví dụ để tạo lại đầu ra:

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

Đầu ra là chính xác, nhưng thông báo này xuất hiện:

summarise()tập hợp lại đầu ra theo 'năm' (ghi đè bằng .groupsđối số)

Điều này nên được giải thích như thế nào? Tại sao nó chỉ báo cáo nhóm lại theo 'năm' khi tôi nhóm theo cả năm và tuần? Ngoài ra, ghi đè nghĩa là gì và tại sao tôi muốn làm điều đó?

Tôi không nghĩ rằng thông báo cho biết có sự cố vì nó xuất hiện trong suốt phiên bản dplyr: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

Tôi tin rằng đó là một thông báo mới vì nó chỉ xuất hiện trên các câu hỏi SO gần đây như Làm thế nào để làm tan kết quả đầu ra của pairwise.wilcox.test bằng cách sử dụng dplyr? R Tổng hợp trên nhiều cột (cả hai cột đều không giải quyết thông báo tập hợp / ghi đè).

Cảm ơn bạn!


Vui lòng đưa ra các ví dụ có thể tái tạo. Gói nào là convert()của?
Dag Hjermann

Nó đến từ hablar. Thêm điều đó vào.
Susie Derkins

Câu trả lời:


115

Nó chỉ là một thông điệp cảnh báo thân thiện. Theo mặc định, nếu có bất kỳ nhóm nào trước biến summarise, nó sẽ loại bỏ một biến nhóm tức là biến cuối cùng được chỉ định trong group_by. Nếu chỉ có một biến nhóm, sẽ không có bất kỳ thuộc tính nhóm nào sau dấu summarisevà nếu có nhiều hơn một, tức là ở đây nó là hai, do đó, thuộc tính để nhóm được giảm xuống 1 tức là dữ liệu sẽ có 'năm' làm thuộc tính nhóm. Như một ví dụ có thể tái tạo

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.

Thông báo là nó đang nhập ungrouptức là khi có một đĩa đơn group_by, nó sẽ loại bỏ nhóm đó sausummarise

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.

Ở đây, nó bỏ nhóm cuối cùng và nhóm lại với 'am'

Nếu chúng tôi kiểm tra ?summarise, có .groupslập luận mà theo mặc định là "drop_last"và các tùy chọn khác là "drop", "keep","rowwise"

.groups - Cấu trúc nhóm của kết quả.

"drop_last": giảm cấp độ cuối cùng của nhóm. Đây là tùy chọn được hỗ trợ duy nhất trước phiên bản 1.0.0.

"drop": Tất cả các cấp độ nhóm đều bị loại bỏ.

"keep": Cấu trúc phân nhóm giống như .data.

"rowwise": Mỗi hàng là một nhóm riêng.

Khi .groups không được chỉ định, bạn sẽ nhận được "drop_last" khi tất cả các kết quả có kích thước 1 hoặc "giữ nguyên" nếu kích thước thay đổi. Ngoài ra, một thông báo sẽ thông báo cho bạn về lựa chọn đó, trừ khi tùy chọn "dplyr.summarise.inform" được đặt thành FALSE.

tức là nếu chúng tôi thay đổi .groupstrong summarise, chúng tôi không nhận được thông báo vì các thuộc tính nhóm bị xóa

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

Trước đây, cảnh báo này đã không được đưa ra và nó có thể dẫn đến tình huống OP thực hiện một mutatehoặc điều gì đó khác giả sử không có nhóm và dẫn đến sản lượng không mong muốn. Bây giờ, cảnh báo cung cấp cho người dùng một dấu hiệu rằng chúng ta nên cẩn thận rằng có thuộc tính nhóm

LƯU Ý: .groupsQuyền bây giờ đang experimentaltrong vòng đời của nó. Vì vậy, hành vi có thể được sửa đổi trong các bản phát hành trong tương lai

Tùy thuộc vào việc chúng ta có cần bất kỳ chuyển đổi dữ liệu nào dựa trên cùng một biến nhóm (hoặc không cần thiết) hay không, chúng ta có thể chọn các tùy chọn khác nhau trong .groups.


11
Điều hữu ích cũng là giải thích tại sao thuộc tính nhóm này lại quan trọng, bởi vì nó không rõ ràng.
jangorecki

6
Điều này có nghĩa là nếu bạn sử dụng .groups = 'drop', bạn không cần phải sử dụng ungroup () trước khi chạy một số hàm khác như case_when hoặc rowSums?
Susie Derkins

7
@SusieDerkins Nếu bạn đang sử dụng summarisevà với groups = 'drop', thì các thuộc tính nhóm không có ở đó, vì vậy bạn không cần phải làm như vậy ungroup(ít nhất là trong kịch bản hiện tại cho đến khi hành vi này được thay đổi thành ngăn nắp)
akrun

1
Bất kỳ lời khuyên nào về cách thiết lập hành vi nhóm trên toàn cầu để tôi không phải nhập nó theo cách thủ công trong suốt các tập lệnh của mình để tránh các thông báo bổ sung?
Mike Lawrence

38
Oh! để tắt tiếng tin nhắn (giữ mặc định "drop_last" cũ), hãy thực hiện tùy chọn (dplyr.summarise.inform = F)
Mike Lawrence
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.