Як інтерпретувати повідомлення dplyr `summarize ()` перегрупуючи вихід на 'x' (перевизначити аргументом `.groups`)?


96

Я почав отримувати нове повідомлення (див. Заголовок допису) під час запуску 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, таких як Як розплавити попарно.wilcox.test вихід за допомогою dplyr? та R Агрегувати за кількома стовпцями (жоден з яких не адресує повідомлення про перегрупування / заміну).

Дякую!


Будь ласка, наведіть відтворювані приклади. Яка упаковка convert()?
Даг Херманн,

Це від hablar. Додаючи це в.
Сьюзі Деркінс

Відповіді:


115

Це просто дружнє попередження. За замовчуванням, якщо перед групою є будь-яка групування 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.

Повідомлення полягає в тому, що воно є ungroupіншим, тобто коли є одиночний 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": Кожен рядок - це своя група.

Якщо .groups не вказано, ви отримуєте "drop_last", коли всі результати мають розмір 1, або "keep", якщо розмір змінюється. Крім того, повідомлення повідомляє вас про цей вибір, якщо для параметра "dplyr.summarise.inform" не встановлено значення FALSE.

тобто якщо ми змінимо .groupsin 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

Раніше це попередження не видавалось, і це могло призвести до ситуацій, коли операційна програма робить mutateабо щось інше, припускаючи відсутність групування та приводить до несподіваних результатів. Тепер попередження дає користувачеві вказівку, що ми повинні бути обережними, щоб існував атрибут групування

ПРИМІТКА: На .groupsданий момент це experimentalйого життєвий цикл. Отже, поведінка може бути змінена в наступних версіях

Залежно від того, чи потрібно нам будь-яке перетворення даних на основі однієї і тієї ж змінної групування (чи не потрібно), ми можемо вибрати різні параметри в .groups.


11
Також було б корисно пояснити, чому цей атрибут групування взагалі важливий, оскільки це не очевидно.
jangorecki

6
Чи означає це, що якщо ви використовуєте .groups = 'drop', вам не потрібно використовувати ungroup () перед запуском деяких інших функцій, таких як case_when або rowSums?
Сьюзі Деркінс

7
@SusieDerkins Якщо ви використовуєте summariseі з groups = 'drop', тоді атрибути групи відсутні, тому вам не потрібно ungroup(принаймні в поточному сценарії, поки ця поведінка не буде змінена в tidyverse)
akrun

1
Будь-яка порада щодо того, як глобально встановити поведінку групування, щоб мені не потрібно було вводити її вручну у всіх сценаріях, щоб уникнути зайвих повідомлень?
Майк Лоуренс,

37
О! щоб замовкнути повідомлення (зберігаючи старе значення "drop_last" за замовчуванням), виконайте параметри (dplyr.summarise.inform = F)
Майк Лоуренс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.