2016-02-23 3 views
1

Я пытаюсь добиться следующего, которое выглядит как this question from me, но это не то же самое. Я хотел бы суммировать и означать все значения из одного и того же идентификатора, если дата больше даты в этой строке. Для ряда 3 это будет означать: 61+61+57=179 и строка 4: 61+57=118 и для среднего значения для одних и тех же строк: (61+61+57)/3, (51+57)/2Условная сумма data.table в R

или взвешенного среднего по дополнительной колонке.

library(data.table) 
set.seed(123) 
DT<-data.table(date=rep(c(2015:2020),3), 
       value=round(runif(18,20,120)), 
       id=rep(c("a","b","c"),each=6)) 

DT 
    date value id 
1: 2015 52 a 
2: 2016 43 a 
3: 2017 34 a 
4: 2018 61 a 
5: 2019 61 a 
6: 2020 57 a 
7: 2015 35 b 
8: 2016 34 b 
9: 2017 43 b 
10: 2018 67 b 
11: 2019 47 b 
12: 2020 106 b 
13: 2015 25 c 
14: 2016 64 c 
15: 2017 100 c 
16: 2018 32 c 
17: 2019 76 c 
18: 2020 41 c 

Я попытался это:

DT[,sum_value:=sum(value[date>date[1]]),by=id] 

Но это не работает. Буду признателен за любую оказанную помощь.

+0

Повторяются ли повторяющиеся даты в пределах одного идентификатора? – Heroka

+0

Не должно быть дубликатов дат в пределах одного идентификатора. –

ответ

4

Предполагая, что нет дублированных дат в идентификатору, и если вы не требуете первоначального заказа, то вы можете использовать:

setorder(DT, id, -date) 
DT[, x := cumsum(value)-value, by = id] 

Для расчета mean предыдущих дат, вы можете использовать:

DT[, z := (cumsum(value)-value)/(seq_len(.N)-1L), by = id] 
+0

У меня была та же линия мышления, хорошая. – Heroka

+0

Спасибо. И если бы это не было суммой, а средним или взвешенным. Например,. Как это будет работать? –

+0

[Выглядит очень хорошо ...] (http://stackoverflow.com/questions/30345867/loop-to-sum-up-observation-greater-than-subject-in-r/30346058#30346058) –

Смежные вопросы