我需要按组计算滚动总和。
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
执行此操作。我想我可能需要按组将数据帧拆分为数据帧列表然后再绑定在一起,但这似乎是一条很长的路线。结果将是按组a
和b
(这是实际数据框的简化示例)的滚动总和的附加列:
roll_group
NA
3
5
7
9
NA
13
15
17
19
答案 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)
)