วิธีตีความข้อความ dplyr `สรุป ()` การจัดกลุ่มผลลัพธ์ใหม่โดย 'x' (แทนที่ด้วยอาร์กิวเมนต์ ".groups`)


115

ฉันเริ่มได้รับข้อความใหม่ (ดูหัวข้อโพสต์) เมื่อเรียกใช้ group_by และสรุป () หลังจากอัปเดตเป็น dplyr เวอร์ชันพัฒนา 0.8.99.9003

นี่คือตัวอย่างในการสร้างเอาต์พุตใหม่:

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

ฉันเชื่อว่าเป็นข้อความใหม่เพราะเพิ่งปรากฏในคำถาม SO ล่าสุดเช่นHow to melt pairwise.wilcox.test output โดยใช้ dplyr? และR รวมในหลายคอลัมน์ (ซึ่งไม่ได้ระบุที่อยู่ของข้อความการจัดกลุ่มใหม่ / การแทนที่)

ขอขอบคุณ!


โปรดทำตัวอย่างที่ทำซ้ำได้ convert()มาจากแพ็คเกจไหน
Dag Hjermann

มันมาจาก hablar การเพิ่มเข้ามา
Susie Derkins

คำตอบ:


138

มันเป็นเพียงข้อความเตือนที่เป็นมิตร โดยค่าเริ่มต้นหากมีการจัดกลุ่มใด ๆ ก่อนหน้าsummariseตัวแปรจะทิ้งตัวแปรกลุ่มหนึ่งตัวนั่นคือตัวแปรสุดท้ายที่ระบุในไฟล์group_by. หากมีตัวแปรการจัดกลุ่มเพียงตัวเดียวจะไม่มีแอตทริบิวต์การจัดกลุ่มใด ๆ หลังจากsummariseและหากมีมากกว่าหนึ่งเช่นที่นี่ก็เป็นสองดังนั้นแอตทริบิวต์สำหรับการจัดกลุ่มจะลดลงเหลือ 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

"drop": การจัดกลุ่มทุกระดับจะลดลง

"keep": โครงสร้างการจัดกลุ่มเดียวกันกับ. data

"rowwise": แต่ละแถวเป็นกลุ่มของตัวเอง

เมื่อไม่ได้ระบุ. group คุณจะได้รับ "drop_last" เมื่อผลลัพธ์ทั้งหมดเป็นขนาด 1 หรือ "keep" หากขนาดแตกต่างกันไป นอกจากนี้ข้อความจะแจ้งให้คุณทราบถึงตัวเลือกนั้นเว้นแต่จะตั้งค่าตัวเลือก "dplyr.summarise.inform" เป็น FALSE

เช่นถ้าเราเปลี่ยน.groupsใน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

ก่อนหน้านี้ไม่มีการออกคำเตือนนี้และอาจนำไปสู่สถานการณ์ที่ OP ทำmutateหรืออย่างอื่นโดยสมมติว่าไม่มีการจัดกลุ่มและส่งผลให้เกิดผลลัพธ์ที่ไม่คาดคิด ตอนนี้คำเตือนทำให้ผู้ใช้ทราบว่าเราควรระวังว่ามีแอตทริบิวต์การจัดกลุ่ม

หมายเหตุ: .groupsตอนนี้อยู่experimentalในวงจรชีวิต ดังนั้นพฤติกรรมนี้สามารถแก้ไขได้ในรุ่นต่อ ๆ ไป

ขึ้นอยู่กับว่าเราต้องการการเปลี่ยนแปลงของข้อมูลตามตัวแปรการจัดกลุ่มเดียวกัน (หรือไม่จำเป็น) เราสามารถเลือกตัวเลือกต่างๆใน.groups.


14
สิ่งที่จะเป็นประโยชน์เช่นกันคือการอธิบายว่าเหตุใดแอตทริบิวต์การจัดกลุ่มนี้จึงมีความสำคัญเนื่องจากไม่ชัดเจน
jangorecki

7
หมายความว่าถ้าคุณใช้. group = 'drop' คุณไม่จำเป็นต้องใช้ ungroup () ก่อนที่จะรันฟังก์ชันอื่น ๆ เช่น case_when หรือ rowSums?
Susie Derkins

8
@SusieDerkins ถ้าคุณใช้summariseและด้วยgroups = 'drop'แสดงว่าไม่มีแอตทริบิวต์ของกลุ่มดังนั้นคุณไม่จำเป็นต้องungroup(อย่างน้อยในสถานการณ์ปัจจุบันจนกว่าพฤติกรรมนี้จะเปลี่ยนไปใน tidyverse)
akrun

50
โอ้! เพื่อปิดเสียงข้อความ (รักษาค่าเริ่มต้น "drop_last" เดิม) ให้ทำตัวเลือก (dplyr.summarise.inform = F)
Mike Lawrence

6
@MikeLawrence ขอบคุณ! นั่นคือทั้งหมดที่ฉันต้องการ เป็นการโต้แย้งเล็กน้อยที่รหัสที่ใช้งานได้ก่อนหน้านี้กำลังส่งคำเตือนอย่างกะทันหัน (ไม่ควรมีคำเตือนที่เป็นมิตร )
Fluffy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.