【问题标题】:Apply a rolling sum by group in R在 R 中按组应用滚动总和
【发布时间】:2016-05-08 21:18:23
【问题描述】:

我需要按组计算滚动总和。

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

【问题讨论】:

标签: r


【解决方案1】:

这里是data.table方式:

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

您也可以使用dplyr 包来实现。

【讨论】:

  • 谢谢,但我正在寻找滚动和而不是 cumsum。我也在使用 dplyr 命令。这是我的代码,但该功能不适用于组:
  • cumsum和rolling sum有什么区别?
【解决方案2】:

谢谢,但是这篇文章中提供的答案使用了 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 

【讨论】:

    【解决方案3】:

    用tapply(或lapply split)包裹它怎么样:

    tapply(y, tmp$g, cumsum)
    

    【讨论】:

      【解决方案4】:

      考虑使用sapply() 结合运行计数和运行总和的基本解决方案:

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

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 2012-03-27
        • 2020-11-10
        • 2017-08-23
        • 2023-03-11
        • 2015-07-21
        • 2019-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多