Добавление обобщенных полей в фрейм данных R

#r #dplyr

Вопрос:

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

 df<-data.frame(Category=c("A","A","A","A","A","B","B","B","B","B","C","C","C","C"),Description=c("A.a","A.b","A.c","A.c","A.c","B.a","B.a","B.b","B.c","C.a","C.a","C.b","C.a","C.c"),Amount=c(900,1200,700,900,1000,1500,2000,3000,400,500,1000,50,80,90))
 

С помощью этого набора данных мне нужно сначала суммировать сумму по Description

 df2<-df%>%group_by(Description)%>%dplyr::summarise(Amt=sum(Amount))
 

Далее я хотел бы подвести итог (суммировать), Category а затем включить это резюме в мой df2 фрейм данных.

Я знаю, как это сделать без использования группировки, вы могли бы использовать within функцию (я думаю), но я не понимаю, как я могу включить сводку в существующий фрейм данных. Результаты будут включать набор данных, сгруппированный по Category включению в виде строки. Результаты хотели бы

 df3<-data.frame(Description=c("A.a","A.b","A.c","A","B.a","B.b","B.c","B","C.a","C.b","C.c","C"),Amt=c(900,1200,2600,4700,3500,3000,400,7400,1580,50,90,1220))
 

Комментарии:

1. Вместо использования summarize попробуйте использовать mutate . Таким образом, вы не потеряете свои исходные столбцы. Вы можете просто добавить еще group_by один под своим mutate и закончить вторым mutate для суммы по категориям

2. Я отредактировал, чтобы показать, какие результаты я надеюсь получить. Спасибо!

Ответ №1:

Вы можете объединить два итоговых вывода.

 library(dplyr)

bind_rows(df %>% 
           group_by(Description)%>% 
            summarise(Amt=sum(Amount)),
          df %>% 
            group_by(Category)%>% 
            summarise(Amt=sum(Amount)) %>% 
            rename(Description = Category)) %>%
  arrange(Description)

#  Description   Amt
#   <chr>       <dbl>
# 1 A            4700
# 2 A.a           900
# 3 A.b          1200
# 4 A.c          2600
# 5 B            7400
# 6 B.a          3500
# 7 B.b          3000
# 8 B.c           400
# 9 C            1220
#10 C.a          1580
#11 C.b            50
#12 C.c            90
 

Ответ №2:

Обновленный ответ:

Вот два подхода. В первом используется bind_rows немного иной (и более короткий) ответ, чем у @Ronaks. Сначала мы mutate df , а затем привязываем его к оригиналу data.frame . Тогда мы сможем использовать group_by и summarise . Для простых случаев, подобных этому, лучше всего подходит первый подход.

Если у вас есть еще много строк, которые вы хотели бы обобщить, мы можем использовать group_modify вместе с add_row ними . В вашем случае нам нужно указать только необходимые столбцы, но мы также могли бы использовать across их для более сложных случаев с большим количеством столбцов.

 library(dplyr)

df %>%
  mutate(Description = Category) %>% 
  bind_rows(df) %>% 
  group_by(Description) %>% 
  summarise(Amt = sum(Amount))

#> # A tibble: 12 x 2
#>    Description   Amt
#>    <chr>       <dbl>
#>  1 A            4700
#>  2 A.a           900
#>  3 A.b          1200
#>  4 A.c          2600
#>  5 B            7400
#>  6 B.a          3500
#>  7 B.b          3000
#>  8 B.c           400
#>  9 C            1220
#> 10 C.a          1580
#> 11 C.b            50
#> 12 C.c            90


df %>% 
  group_by(Category, Description) %>% 
  summarise(Amt = sum(Amount)) %>% 
  group_modify(~ .x %>% 
                 add_row(Description = unlist(.y), 
                         Amt = sum(.x$Amt)))

#> `summarise()` has grouped output by 'Category'. You can override using the `.groups` argument.
#> # A tibble: 13 x 3
#> # Groups:   Category [3]
#>    Category Description   Amt
#>    <chr>    <chr>       <dbl>
#>  1 A        A.a           900
#>  2 A        A.b          1200
#>  3 A        A.c          2600
#>  4 A        A            4700
#>  5 B        B.a          3500
#>  6 B        B.b          3000
#>  7 B        B.c           400
#>  8 B        C.a           500
#>  9 B        B            7400
#> 10 C        C.a          1080
#> 11 C        C.b            50
#> 12 C        C.c            90
#> 13 C        C            1220
 

Создано 2021-09-24 пакетом reprex (v2.0.1)

Комментарии:

1. Это отличные ответы и близко к тому, что я ищу, я по незнанию не включил то, что я хотел бы, чтобы результаты выглядели так. Я отредактировал свой пост, чтобы показать, какой окончательный фрейм данных я надеюсь вернуть.

2. @a_js12: Смотрите мой обновленный ответ с некоторыми альтернативами.