Объединение различных аннотаций в dplyr

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

Представление, использующее модифицированный набор данных алмазов для иллюстрации, приведено ниже:

library(tidyverse)

diamond_renamed <- diamonds %>% 
  rename(size_x = x, size_y = y, size_z = z) %>% 
  rename(val_1 = depth, val_2 = table)


diamond_summary <-  bind_cols(diamond_renamed %>% 
                               group_by(cut, color, clarity) %>% 
                               summarise(
                                 cost = sum(price)
                               ), 
                             diamond_renamed %>%
                             group_by(cut, color, clarity) %>%
                               summarise_at(
                                 vars(contains("size")), 
                                 funs(median(.))
                                            ),
                             diamond_renamed %>%
                             group_by(cut, color, clarity) %>% 
                               summarise_at(
                                 vars(contains("val")),
                                 funs(mean(.))
                                 )
                             )

diamond_summary    
#> # A tibble: 276 x 15
#> # Groups:   cut, color [?]
#>    cut   color clarity   cost cut1  color1 clarity1 size_x size_y size_z
#>    <ord> <ord> <ord>    <int> <ord> <ord>  <ord>     <dbl>  <dbl>  <dbl>
#>  1 Fair  D     I1       29532 Fair  D      I1         7.32   7.20   4.70
#>  2 Fair  D     SI2     243888 Fair  D      SI2        6.13   6.06   3.99
#>  3 Fair  D     SI1     247854 Fair  D      SI1        6.08   6.04   3.93
#>  4 Fair  D     VS2     112822 Fair  D      VS2        6.04   6      3.65
#>  5 Fair  D     VS1      14606 Fair  D      VS1        5.56   5.58   3.66
#>  6 Fair  D     VVS2     32463 Fair  D      VVS2       4.95   4.84   3.31
#>  7 Fair  D     VVS1     13419 Fair  D      VVS1       4.92   5.03   3.28
#>  8 Fair  D     IF        4859 Fair  D      IF         4.68   4.73   2.88
#>  9 Fair  E     I1       18857 Fair  E      I1         6.18   6.14   4.03
#> 10 Fair  E     SI2     325446 Fair  E      SI2        6.28   6.20   3.95
#> # ... with 266 more rows, and 5 more variables: cut2 <ord>, color2 <ord>,
#> #   clarity2 <ord>, val_1 <dbl>, val_2 <dbl>

Это дает желаемый результат: набор данных с сгруппированными сводками ... но он также повторяет сгруппированные переменные. Также нехорошо повторять каждый раз сам код group_by ... но я не знаю, как еще это сделать. Также это может быть не самое эффективное использование summarise. Как мы можем избежать этого повторения, улучшить этот код?

Спасибо!

1
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из вариантов - использовать mutate вместо summarize на начальных этапах и добавить эти столбцы в group_by.

diamond_renamed %>%
   group_by(cut, color, clarity) %>% 
   group_by(cost = sum(price), add = TRUE) %>%
   mutate_at(vars(contains("size")), median) %>% 
   group_by_at(vars(contains("size")), .add = TRUE) %>% 
   summarise_at(vars(contains("val")), mean)
# A tibble: 276 x 9
# Groups:   cut, color, clarity, cost, size_x, size_y [?]
#   cut   color clarity   cost size_x size_y size_z val_1 val_2
#   <ord> <ord> <ord>    <int>  <dbl>  <dbl>  <dbl> <dbl> <dbl>
# 1 Fair  D     I1       29532   7.32   7.20   4.70  65.6  56.8
# 2 Fair  D     SI2     243888   6.13   6.06   3.99  64.7  58.6
# 3 Fair  D     SI1     247854   6.08   6.04   3.93  64.6  58.8
# 4 Fair  D     VS2     112822   6.04   6      3.65  62.7  60.3
# 5 Fair  D     VS1      14606   5.56   5.58   3.66  63.2  57.8
# 6 Fair  D     VVS2     32463   4.95   4.84   3.31  61.7  58.8
# 7 Fair  D     VVS1     13419   4.92   5.03   3.28  61.7  64.3
# 8 Fair  D     IF        4859   4.68   4.73   2.88  60.8  58  
# 9 Fair  E     I1       18857   6.18   6.14   4.03  65.6  58.1
#10 Fair  E     SI2     325446   6.28   6.20   3.95  63.4  59.5
# ... with 266 more rows

ПРИМЕЧАНИЕ. Группирующие столбцы «вырезать», «цвет», «четкость» здесь не повторяются, как в сообщении ОП. Итак, всего 9 столбцов вместо 15

Спасибо, акрун, вроде работает! Меня немного смущает необходимость добавлять group_by_at после mutate, зачем это нужно? Что он делает?

Fons MA 28.10.2018 06:03

@FonsMA mutate заменяет значения столбцов, в которых есть «размер», на значения median, сгруппированные по «стоимости», «вырезке», цвету «четкость». Затем используйте эти столбцы, у которых есть `` медиана '' также в переменной группировки (здесь значение медианы повторяется для каждой группы), и когда вы выполните summarize, эти столбцы (итоговый результат) также будут присутствовать в выходных данных.

akrun 28.10.2018 06:49

Спасибо, akrun, поэтому я понимаю, что код должен добавить каждую переменную, которая была создана, в подмножество группирующих переменных; Я не уверен, что понимаю специфику, но в этом есть логика; благодарю вас!

Fons MA 28.10.2018 11:15

@FonsMA Если вы разделите код на части и выполните пошаговое выполнение, проверьте вывод, вы поймете его более четко. т.е. после запуска первых двух строк, затем запустите третью и проверьте, какие изменения она внесла

akrun 28.10.2018 18:25

Другие вопросы по теме