在R中按组应用滚动总和

时间:2016-05-08 21:18:24

标签: 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

4 个答案:

答案 0 :(得分:2)

以下是data.table方式:

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

您也可以使用dplyr包。

答案 1 :(得分: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 

答案 2 :(得分:0)

如何用tapply(或lapply split)包装它:

tapply(y, tmp$g, cumsum)

答案 3 :(得分:0)

考虑这个基本解决方案,sapply()结合运行计数和运行总和:

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