Чтобы воспроизвести результат ОП, все, что нужно, это функция cumsum
, как показывает ответ Чейза.Однако формулировка OP «для каждой строки», возможно, указывает на интерес к кумулятивным суммам матрицы или фрейма данных.
Для столбцовых сумм data.frame, что интересно, cumsum
снова все однонуждается!cumsum
является примитивом, который входит в группу Math
общих функций, которая определена для фреймов данных как применение функции к каждому столбцу;внутри кода он просто делает это: x[] <- lapply(x, .Generic, ...)
.
> foo <- matrix(1:6, ncol=3)
> df <- data.frame(foo)
> df
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> cumsum(df)
X1 X2 X3
1 1 3 5
2 3 7 11
Интересно, что sum
не является частью Math
, но входит в группу Summary
универсальных функций;для фреймов данных эта группа сначала преобразует фрейм данных в матрицу, а затем вызывает общий тип, поэтому sum
возвращает не суммы по столбцам, а общую сумму:
> sum(df)
[1] 21
Это расхождение (в моеммнение) скорее всего потому, что cumsum
возвращает матрицу того же размера, что и оригинал, но sum
не будет.
Для строковых кумулятивных сумм не существует ни одной функции, которая воспроизводит это поведение, которое язнать о;Решение Iterator, вероятно, является одним из самых простых.
Если скорость является проблемой, почти наверняка было бы самым быстрым и надежным написать ее на C;тем не менее, он немного ускоряется (~ 2x?) для длинных циклов, используя простой цикл for.
rowCumSums <- function(x) {
for(i in seq_len(dim(x)[1])) { x[i,] <- cumsum(x[i,]) }; x
}
colCumSums <- function(x) {
for(i in seq_len(dim(x)[2])) { x[,i] <- cumsum(x[,i]) }; x
}
Это можно ускорить, используя обычный cumsum
и вычитая сумму такдалеко, когда вы доберетесь до конца столбца.Для кумулятивных сумм строк нужно транспонировать дважды.
colCumSums2 <- function(x) {
matrix(cumsum(rbind(x,-colSums(x))), ncol=ncol(x))[1:nrow(x),]
}
rowCumSums2 <- function(x) {
t(colCumSums2(t(x)))
}
Хотя это действительно взлом.Не делай этого.