Calcolo della sum cumulativa per ogni riga

Sto cercando di calcolare la sum cumulativa per ogni riga usando il seguente codice:

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

Ma non mi piace il ciclo esplicito qui, come posso modificarlo?

Vuoi cumsum()

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

Puoi anche provare mySum = t(apply(df, 1, cumsum)) .

La trasposizione è lì perché i risultati vengono trasposti, per una ragione che non ho ancora determinato.

Sono sicuro che ci sono buone soluzioni con plyr , come i metodi ddply e multicore.

Per replicare il risultato dell’OP, la funzione cumsum è tutto ciò che è necessario, come mostra la risposta di Chase. Tuttavia, la formulazione dell’OP “per ogni riga” indica probabilmente l’interesse nelle somme cumulative di una matrice o di un frame di dati.

Per quanto riguarda le cumsum di una data.frame per colonne, è interessante cumsum è di nuovo tutto ciò di cui si ha bisogno! cumsum è una primitiva che fa parte del gruppo Math di funzioni generiche, che è definita per i frame di dati che applicano la funzione a ciascuna colonna; all’interno del codice, fa proprio questo: 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 

È interessante notare che la sum non fa parte di Math , ma fa parte del gruppo Summary di funzioni generiche; per i frame di dati, questo gruppo converte prima il frame di dati in una matrice e poi chiama il generico, quindi la sum restituisce non somme per colonna ma la sum complessiva:

 > sum(df) [1] 21 

Questa discrepanza è (secondo me) molto probabilmente perché cumsum restituisce una matrice della stessa dimensione dell'originale, ma la sum non lo sarebbe.

Per somme cumulative per riga, non esiste una singola funzione che riproduca questo comportamento che io conosca; La soluzione di Iterator è probabilmente una delle più semplici.

Se la velocità è un problema, sarebbe quasi certamente il più veloce e il più infallibile da scrivere in C; tuttavia, accelera un po '(~ 2x?) per i loop lunghi usando un ciclo for semplice.

 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 } 

Questo può essere velocizzato di più usando il semplice cumsum e sottraendo la sum fino a quel momento quando arrivi alla fine di una colonna. Per somme cumulative di riga, è necessario trasporre due volte.

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

Però è davvero un trucco. Non farlo

Con data.table puoi anche usare

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