Построчная кумулятивная сумма

У меня есть data.table dt следующим образом.

df <- data.frame(t1 = rep(0,5), t3 = c(12, 5, 8,9, 5), t7= c(25, 48, 7, 9, 14))
dt <- setDT(df)
dt
   t1 t3 t7
1:  0 12 25
2:  0  5 48
3:  0  8  7
4:  0  9  9
5:  0  5 14

Я хочу получить совокупные суммы по столбцам. Я получаю это только через ряды. Как это сделать в data.table.

dt[, 1:3 := cumsum(dt)]
dt
   t1 t3  t7
1:  0 12  25
2:  0 17  73
3:  0 25  80
4:  0 34  89
5:  0 39 103

Желаемый результат выглядит следующим образом:

dt
   t1 t3 t7
1:  0 12 37
2:  0  5 53
3:  0  8 15
4:  0  9 18
5:  0  5 19

person Crops    schedule 27.10.2017    source источник
comment
setDT(df) преобразуется на месте, назначать не нужно   -  person eddi    schedule 27.10.2017


Ответы (2)


Другой вариант использования Reduce с accumulate=TRUE:

dt[, names(dt) := Reduce(`+`, dt, accumulate = TRUE)]

dt
#   t1 t3 t7
#1:  0 12 37
#2:  0  5 53
#3:  0  8 15
#4:  0  9 18
#5:  0  5 19
person Psidom    schedule 27.10.2017
comment
на основе нескольких тестов этот метод значительно превосходит другие по скорости - person Slug Pue; 27.10.2017

Если нам нужно сделать это по строкам, то один из вариантов — группировать по строкам, unlist, получить cumsum, преобразовать в list и назначить столбцам.

dt[, (1:3) := as.list(cumsum(unlist(.SD))), 1:nrow(dt)]
dt
#    t1 t3 t7
#1:  0 12 37
#2:  0  5 53
#3:  0  8 15
#4:  0  9 18
#5:  0  5 19

Или другой вариант rowCumsums из matrixStats, который можно применить к matrix

library(matrixStats)
dt[, (1:3) := as.data.table(rowCumsums(as.matrix(.SD)))]
person akrun    schedule 27.10.2017