Dplyr `rowwise ()` группирует таким же образом, что group_by () `группирует? - PullRequest
0 голосов
/ 04 мая 2020
library(tidyverse)
mtcars %>% group_by(cyl) %>% is_grouped_df()
#> [1] TRUE

Я могу сгруппировать фрейм данных по переменной и подтвердить, сгруппирован ли он с помощью функции is_grouped_df() (как показано выше).

Я могу выполнить тот же анализ на dplyr rowwise() и, похоже, rowwise() не группирует наборы данных по строкам. У меня есть вопрос, и чтение страницы справки (?rowwise) не дает четкого ответа на вопрос для меня.

Групповой ввод по строкам

Описание: rowwise () позволяет вычислять фрейм данных по строкам за раз. Это наиболее полезно, когда векторизованная функция не существует.

Пошаговая строка сохраняет свой построчный статус, пока не будет явно удалена group_by (), ungroup () или as_tibble ().

Мой вопрос : после вызова функции rowwise() нужно ли позже вызывать функцию ungroup() в моем канале, чтобы разгруппировать мой набор данных? Или это сделано по умолчанию? Следующий канал предполагает, что канал, содержащий rowwise(), не сгруппирован:

mtcars %>% rowwise() %>% is_grouped_df()
#> [1] FALSE

Это предложение вводит меня в заблуждение: " Пошаговая строка сохраняет свой построчный статус до тех пор, пока явно не будет удалена. .. ungroup () ...". Зачем мне нужно ungroup() тиббл, который уже разгруппирован?

1 Ответ

2 голосов
/ 04 мая 2020

Интересное наблюдение. Это может быть ошибка is_grouped_df, если это не та особенность, о которой я не знаю. Но я ДЕЙСТВИТЕЛЬНО считаю, что ungroup важно, учитывая тестирование, проведенное ниже (см. Комментарии):

library(tidyverse)

mtcars %>% select(1:3) %>% rowwise() %>% head(2)
#> Source: local data frame [2 x 3]
#> Groups: <by row>
##### ^ THIS DOES HAVE A GROUP ####
#> 
#> # A tibble: 2 x 3
#>     mpg   cyl  disp
#>   <dbl> <dbl> <dbl>
#> 1    21     6   160
#> 2    21     6   160

mtcars %>% select(1:3) %>% rowwise() %>% mutate(n()) %>% head(2)
#> Source: local data frame [2 x 4]
#> Groups: <by row>
#> 
#> # A tibble: 2 x 4
#>     mpg   cyl  disp `n()`
#>   <dbl> <dbl> <dbl> <int>
#> 1    21     6   160     1
#> 2    21     6   160     1
mtcars %>% select(1:3) %>% mutate(n()) %>% head(2)                                              
#>   mpg cyl disp n()
#> 1  21   6  160  32
#> 2  21   6  160  32

##### ^ THIS IS EXPECTED AND THE n BEHAVES DIFFERENTLY WHEN THE ROWWISE() IS APPLIED ####

##### IF WE WANT TO RESTORE "NORMAL" BEHAVIOR, IT'S PROBABLY WISE TO UNGROUP IN ORDER TO LOSE THE ROWWISE OPERATIONS #####
mtcars %>% select(1:3) %>% rowwise() %>% ungroup %>% mutate(n()) %>% head(2)
#> # A tibble: 2 x 4
#>     mpg   cyl  disp `n()`
#>   <dbl> <dbl> <dbl> <int>
#> 1    21     6   160    32
#> 2    21     6   160    32

## ^ NORMAL AFTER UNGROUP
...