dplyr 메시지`summarise ()`재 그룹화 출력을 'x'로 해석하는 방법 (`.groups` 인수로 재정의)?


94

dplyr 개발 버전 0.8.99.9003으로 업데이트 한 후 group_by 및 summarise ()를 실행할 때 새 메시지 (게시물 제목 참조)를 받기 시작했습니다.

다음은 출력을 다시 만드는 예입니다.

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

dplyr을 사용하여 pairwise.wilcox.test 출력을 녹이는 방법 과 같은 매우 최근의 SO 질문에만 나타났기 때문에 새로운 메시지라고 생각합니다 . R 여러 열에 대한 집계 (둘 다 재 그룹화 / 재정의 메시지를 처리하지 않음).

감사합니다!


재현 가능한 예를 만드십시오. 어떤 패키지 convert()에서 왔습니까?
Dag Hjermann

하 블라에서 온 것입니다. 추가.
Susie Derkins

답변:


114

그것은 단지 친근한 경고 메시지입니다. 기본적으로 이전에 그룹화가있는 경우 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": 각 행은 자체 그룹입니다.

.groups를 지정하지 않으면 모든 결과가 크기 1이면 "drop_last"가 표시되고 크기가 다양하면 "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

이전에는이 ​​경고가 발행되지 않았으며 OP가 mutate그룹화가 없다고 가정하고 다른 작업을 수행하고 예기치 않은 출력 이 발생하는 상황으로 이어질 수 있습니다 . 이제 경고는 사용자에게 그룹화 속성이 있음을주의해야한다는 표시를 제공합니다.

참고 : .groups지금은 experimental수명주기에 있습니다. 따라서이 동작은 향후 릴리스에서 수정 될 수 있습니다.

동일한 그룹화 변수 (또는 필요하지 않음)를 기반으로 데이터를 변환해야하는지 여부에 따라에서 다른 옵션을 선택할 수 있습니다 .groups.


11
이 그룹화 속성이 명확하지 않기 때문에 왜 중요한지 설명하는 것도 유용합니다.
jangorecki

6
이것은 .groups = 'drop'을 사용하는 경우 case_when 또는 rowSums와 같은 다른 특정 함수를 실행하기 전에 ungroup ()을 사용할 필요가 없음을 의미합니까?
Susie Derkins

7
당신이 사용하는 경우 @SusieDerkins summarise, 그리고와 groups = 'drop'당신이 필요하지 않도록 다음 그룹 속성이 존재하지 않습니다, ungroup(현재 시나리오에서 적어도이 behaviior이 tidyverse에서 변경 될 때까지)
akrun

1
추가 메시지를 피하기 위해 스크립트 전체에 수동으로 입력 할 필요가 없도록 그룹화 동작을 전역 적으로 설정하는 방법에 대한 조언이 있습니까?
Mike Lawrence

37
오! 메시지를 무음으로 설정하려면 (이전 "drop_last"기본값 유지) options (dplyr.summarise.inform = F)
Mike Lawrence
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.