Как объединить строки в одну на основе дублирования и условий в R

#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(!дублируется (время))