#r
#r
Вопрос:
начинается мой первый вопрос в stack-overflow.
У меня есть этот код:
a <- rep(letters[1:4], each = 4); time <- c(0,0,1,1,0,1,2,2,1,1,2,2,0,0,1,2);
cost <- rep(c(0.4,0.2,0.1,0.5,0.5,0.22,0.15,0.18),each =2);
df <- data.frame(a = a, time = time, cost = cost);
Приведенный выше код является лишь краткой иллюстрацией из большого количества имеющихся у меня данных.
Изображенный фрейм данных — это:
Знаете ли вы, как я могу объединить строки с дублированными значениями времени в одну, а также объединить затраты (они представляют разные виды затрат, даже если они встречаются в некоторых случаях) в каждый момент времени для каждой буквы столбца a?
Заранее спасибо!
Ответ №1:
Работает ли это:
> library(dplyr)
> df %>% group_by(a, time) %>% summarise(cost = sum(cost))
`summarise()` regrouping output by 'a' (override with `.groups` argument)
# A tibble: 10 x 3
# Groups: a [4]
a time cost
<chr> <dbl> <dbl>
1 a 0 0.8
2 a 1 0.4
3 b 0 0.1
4 b 1 0.1
5 b 2 1
6 c 1 1
7 c 2 0.44
8 d 0 0.3
9 d 1 0.18
10 d 2 0.18
>
Использование базового R:
> aggregate(cost~a time, df, sum)
a time cost
1 a 0 0.80
2 b 0 0.10
3 d 0 0.30
4 a 1 0.40
5 b 1 0.10
6 c 1 1.00
7 d 1 0.18
8 b 2 1.00
9 c 2 0.44
10 d 2 0.18
>
Комментарии:
1. Это работает, но что, если у меня больше столбцов, и я хотел бы добавить вывод функции summarise в исходный фрейм данных? Например, если мой фрейм данных содержит больше переменных: a <- rep(буквы [1: 4], каждая = 4) время <- c(0,0,1,1,0,1,2,2,1,1,2,2,0,0,1,2) стоимость <- rep(c(0.4,0.2,0.1,0.5,0.5,0.22,0.15,0.18), каждый = 2) другое <-rep(c(0.5,0.4,0.3,0.14), каждый = 4) пол <- rep(c(‘мужчина’,’женщина’), каждый = 8,by = 4) df <- data.frame(a = a, time = время,стоимость = стоимость, другое = другое, пол = пол)
2. вы можете попробовать: df %>% group_by(a, время, пол) %>% summarise(по (c(стоимость, другое), ~ sum(.)))
3. @KarthikS: Кажется, я добавил точно такие же предложения в комментариях несколько минут назад . Ваш ответ, конечно, опубликован задолго до моих комментариев. Вопрос был предложен мне в очереди проверки SO, поэтому я не видел вашего ответа, извините за это.
4. @R.S. все в порядке!
5. Я думаю, что другой способ, который, я думаю, сработал для меня, заключается в том, чтобы вместо суммирования использовать mutate, а затем фильтровать переменную по дублированным значениям, например, после mutate: filter(!дублируется (время))