指定范围内的滚动总和

时间:2017-10-21 16:11:01

标签: r dplyr data.table

对于df我想在过去10秒内获取Value列的滚动总和,以秒为单位给出Time。数据帧非常大,因此使用dply :: complete不是一个选项(数百万数据点,毫秒级)。我更喜欢dplyr解决方案,但认为可能有数据表left_join,只是不能使它工作。

df = data.frame(Row=c(1,2,3,4,5,6,7),Value=c(4,7,2,6,3,8,3),Time=c(10021,10023,10027,10035,10055,10058,10092))

解决方案会添加一个列(Sum.10S),该列采用过去10秒的滚动总和:

df$Sum.10S=c(4,11,13,8,3,11,3)

2 个答案:

答案 0 :(得分:2)

定义一个函数sum10,它总结最后10秒并将其与rollapplyr一起使用。它避免了显式循环,并且运行速度比使用问题中的数据的显式循环快10倍。

library(zoo)

sum10 <- function(x) {
  if (is.null(dim(x))) x <- t(x)
  tt <- x[, "Time"]
  sum(x[tt >= tail(tt, 1) - 10, "Value"])
}

transform(df, S10 = rollapplyr(df, 10, sum10, by.column = FALSE, partial = TRUE))

,并提供:

  Row Value  Time  S10
1   1     4 10021    4
2   2     7 10023   11
3   3     2 10027   13
4   4     6 10035    8
5   5     3 10055    3
6   6     8 10058   11
7   7     3 10092    3

答案 1 :(得分:1)

嗯,我的速度不够快,无法获得第一个答案。但这个解决方案更简单,不需要外部库。

df = data.frame(Row=c(1,2,3,4,5,6,7),Value=c(4,7,2,6,3,8,3),Time=c(10021,10023,10027,10035,10055,10058,10092))

df$SumR<-NA
for(i in 1:nrow(df)){
  df$SumR[i]<-sum(df$Value[which(df$Time<=df$Time[i] & df$Time>=df$Time[i]-10)])
  }

  Row Value  Time SumR
1   1     4 10021    4
2   2     7 10023   11
3   3     2 10027   13
4   4     6 10035    8
5   5     3 10055    3
6   6     8 10058   11
7   7     3 10092    3