2016-05-08 25 views
0

我需要按組計算滾動總和。在R中按組申請滾動總和

y<- 1:10 
tmp<-data.frame(y) 
tmp$roll<-NA 
tmp$roll[2:10]<-rollapply (y, 2, sum) 
tmp$g<-(c("a","a","a","a","a","b","b","b","b","b")) 

tmp$roll計算tmp$y滾動總和;我需要通過tmp$g來做到這一點。我想我可能需要將數據幀按組分組成數據幀列表,然後再綁定在一起,但這看起來像是一條漫長的路線。其結果將是通過組ab滾動總和的一個附加列(實際數據幀的這個簡化的例子):

roll_group 
NA 
3 
5 
7 
9 
NA 
13 
15 
17 
19 
+0

見http://stackoverflow.com/questions/35249019/grouped-moving-average-in-r/35284632#35284632 –

回答

1

謝謝,但在這篇文章中提供的答案使用cumsum而我需要NA的軋製總和,如果沒有足夠的滯後值。我解決了它這種方式:

#function to calculate rolled sum, returns a column vector 
roll<-function(x,lags){ 
if (length(x)<lags) { 
tmp=c(rep(NA,length(x))) 
} 
else { 
tmp=rollsum(x, lags, align = "right", fill = NA) 
} 
tmp=as.numeric(tmp) 
return(tmp) 
} 

tmp1 <- tmp %>% 
group_by(g) %>% 
mutate(roll_group = ave(y, g, FUN = function(x) roll(x, 2)))%>% 
ungroup 
0

怎麼樣在tapply包裹它(或lapply分割):

tapply(y, tmp$g, cumsum) 
2

這裏是data.table方式:

library(data.table) 
tmp.dt <- data.table(tmp) 
tmp.dt <- tmp.dt[, .(y =y, roll = cumsum(y)), by = g] 

你可以用dplyr包做得一樣好。

+0

謝謝,但我期待爲滾動總和不cumsum。另外我正在使用dplyr命令。這是我的代碼,但該函數不適用於組: – Sassafras

+0

cumsum和rolling sum之間的區別是什麼? – Bulat

0

考慮與sapply()此基礎解決方案結合運行計數和運行總和:

tmp$roll <- sapply(1:nrow(tmp), 
        function(i) 
         sum((tmp[1:i, c("g")] == tmp$g[i]) * tmp[1:i,]$y) 
        )