Calculando sum cumulativa para cada linha

Eu estou tentando calcular a sum cumulativa para cada linha usando o seguinte código:

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

Mas eu não gosto do loop explícito aqui, como posso modificá-lo?

Você quer cumsum()

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

Você também pode tentar mySum = t(apply(df, 1, cumsum)) .

A transposição está aí porque os resultados saem transpostos, por uma razão que ainda não determinei.

Tenho certeza de que existem boas soluções com plyr , como os methods ddply e multicore.

Para replicar o resultado do OP, a function cumsum é tudo o que é necessário, como mostra a resposta de Chase. No entanto, o texto do OP “para cada linha” possivelmente indica interesse nas sums cumulativas de uma matriz ou quadro de dados.

Para cumsums em coluna de um data.frame, curiosamente, cumsum é novamente tudo que precisamos! cumsum é um primitivo que faz parte do grupo Math de funções genéricas, que é definido para frameworks de dados como aplicando a function a cada coluna; dentro do código, ele faz isso: 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, sum não faz parte do Math , mas parte do grupo Summary de funções genéricas; para frameworks de dados, esse grupo primeiro converte o quadro de dados em uma matriz e, em seguida, chama o genérico, portanto, a sum não retorna sums em coluna, mas a sum global:

 > sum(df) [1] 21 

Essa discrepância é (na minha opinião) muito provável porque o cumsum retorna uma matriz do mesmo tamanho do original, mas a sum não.

Para sums cumulativas em linha, não há uma única function que replique esse comportamento que eu saiba; A solução do iterador é provavelmente uma das mais simples.

Se a velocidade é um problema, seria quase certamente mais rápido e mais infalível escrevê-la em C; no entanto, ele acelera um pouco (~ 2x?) for loops longos usando um loop for simples.

 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 } 

Isso pode ser acelerado mais usando o cumsum simples e subtrair a sum até o momento em que você chegar ao final de uma coluna. Para sums cumulativas de linha, é preciso transpor duas vezes.

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

Isso é realmente um truque embora. Não faça isso.

Com data.table você também pode usar

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