#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: Смотрите мой обновленный ответ с некоторыми альтернативами.