Как добавить итоги столбцов в сгруппированные резюме в R - PullRequest
0 голосов
/ 29 января 2019

Я нахожусь в процессе создания сводных таблиц на основе подгрупп и хотел бы добавить общую сводку более аккуратным / более эффективным способом.

То, что у меня пока есть, это.Я создал сводки по уровням в моих факторных переменных.

library(tidyverse)

df <- data.frame(var1 = 10:18, 
                 var2 = c("A","B","A","B","A","B","A","B","A"))

group_summary <- df %>% group_by(var2) %>% 
                 filter(var2 != "NA") %>% 
                 summarise("Max" = max(var1, na.rm = TRUE),
                           "Median" = median(var1, na.rm = TRUE),
                           "Min" = min(var1, na.rm = TRUE),
                           "IQR" = IQR(var1, na.rm = TRUE),
                           "Count" = n())

Далее я создал общее резюме.

Summary <- df %>% 
           filter(var2 != "NA") %>% 
           summarise("Max" = max(var1, na.rm = TRUE),
           "Median" = median(var1, na.rm = TRUE),
           "Min" = min(var1, na.rm = TRUE),
           "IQR" = IQR(var1, na.rm = TRUE),
           "Count" = n())

Наконец, я связал два объекта с dplyr::bind_rows

complete_summary <- bind_rows(Summary, group_summary)

То, что я сделал, работает, но это очень, очень многословно и не может быть наиболее эффективнымпуть.Я пытался использовать ungroup

  group_summary <- df %>% group_by(var2) %>% 
                 filter(var2 != "NA") %>% 
                 summarise("Max" = max(var1, na.rm = TRUE),
                           "Median" = median(var1, na.rm = TRUE),
                           "Min" = min(var1, na.rm = TRUE),
                           "IQR" = IQR(var1, na.rm = TRUE),
                           "Count" = n()) %>% ungroup %>% 
                 summarise("Max" = max(var1, na.rm = TRUE),
                           "Median" = median(var1, na.rm = TRUE),
                           "Min" = min(var1, na.rm = TRUE),
                           "IQR" = IQR(var1, na.rm = TRUE),
                           "Count" = n())

, но он выдал ошибку:

  Evaluation error: object var1 not found.

Заранее спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

В идеале, если вы хотите сделать это в одной цепочке, это то, как вы можете сделать это, используя bind_rows для объединения обоих результатов, как вы это сделали, но удаляя созданные вами временные объекты.

library(tidyverse)
#> Warning: package 'tibble' was built under R version 3.5.2

df <- data.frame(var1 = 10:18, 
                 var2 = c("A","B","A","B","A","B","A","B","A"))



df %>% group_by(var2) %>% 
  filter(var2 != "NA") %>% 
  summarise("Max" = max(var1, na.rm = TRUE),
            "Median" = median(var1, na.rm = TRUE),
            "Min" = min(var1, na.rm = TRUE),
            "IQR" = IQR(var1, na.rm = TRUE),
            "Count" = n()) %>% #ungroup() %>% 

  bind_rows( df %>% summarise("Max" = max(var1, na.rm = TRUE),
                    "Median" = median(var1, na.rm = TRUE),
                    "Min" = min(var1, na.rm = TRUE),
                    "IQR" = IQR(var1, na.rm = TRUE),
                    "Count" = n()))
#> # A tibble: 3 x 6
#>   var2    Max Median   Min   IQR Count
#>   <fct> <dbl>  <dbl> <dbl> <dbl> <int>
#> 1 A        18     14    10     4     5
#> 2 B        17     14    11     3     4
#> 3 <NA>     18     14    10     4     9

Создано в 2019-01-29 пакетом Представить (v0.2.1)

0 голосов
/ 29 января 2019

Не самое элегантное решение, но простое:

c <- mtcars %>%
  mutate(total_mean = mean(wt),
         total_median = median(wt)) %>%
  group_by(cyl) %>%
  summarise(meanweight = mean(wt),
            medianweight = median(wt),
            total_mean = first(total_mean),
            total_median = first(total_median)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...