Cálculo de la sum acumulada de cada fila

Estoy tratando de calcular la sum acumulada para cada fila usando el siguiente código:

df <- data.frame(count=1:10) for (loop in (1:nrow(df))) {df[loop,"acc_sum"] <- sum(df[1:loop,"count"])} 

Pero no me gusta el ciclo explícito aquí, ¿cómo puedo modificarlo?

Quieres cumsum()

 df <- within(df, acc_sum <- cumsum(count)) 

También puede probar mySum = t(apply(df, 1, cumsum)) .

La transposición está allí porque los resultados salen transpuestos, por una razón que aún no he determinado.

Estoy seguro de que hay buenas soluciones con plyr , como los métodos ddply y multinúcleo.

Para replicar el resultado del OP, la función cumsum es todo lo que se necesita, como lo muestra la respuesta de Chase. Sin embargo, la fraseología del PO “para cada fila” posiblemente indique interés en las sums acumuladas de una matriz o dataframe.

Para cumsums de columna de un data.frame, curiosamente, ¡ cumsum es todo lo que uno necesita! cumsum es una primitiva que forma parte del grupo Math de funciones genéricas, que se define para marcos de datos como la aplicación de la función a cada columna; dentro del código, simplemente hace esto: 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 

Curiosamente, la sum no es parte de Math , sino parte del grupo de Summary de funciones genéricas; para los marcos de datos, este grupo primero convierte el dataframe en una matriz y luego llama al genérico, de modo que la sum no devuelve sums en columnas, sino la sum total:

 > sum(df) [1] 21 

Esta discrepancia es (en mi opinión) muy probablemente porque cumsum devuelve una matriz del mismo tamaño que el original, pero la sum no.

Para las sums acumulativas fila por línea, no hay una sola función que replique este comportamiento que yo sepa; La solución de Iterator es probablemente una de las más directas.

Si la velocidad es un problema, seguramente sería más rápido y más infalible escribirla en C; sin embargo, se acelera un poco (~ 2x?) para bucles largos mediante el uso de un bucle simple.

 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 } 

Esto se puede acelerar más utilizando la cumsum simple y restando la sum hasta el momento en que se llega al final de una columna. Para las sums acumulativas de filas, es necesario transponer dos veces.

 colCumSums2 <- function(x) { matrix(cumsum(rbind(x,-colSums(x))), ncol=ncol(x))[1:nrow(x),] } rowCumSums2 <- function(x) { t(colCumSums2(t(x))) } 

Eso es realmente un truco. No lo hagas

Con data.table también puedes usar

 dt <- as.data.table(df) dt[, acc_sum := cumsum(count)]