在指定范围内的滚动金额

在指定范围内的滚动金额

问题描述:

对于df我想在最后10秒内取值列的滚动总和,时间以秒为单位。数据帧非常大,所以使用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) 
+0

将第三个数字固定为13以反映评论。因此,第三行有10027年的时间,并且累计了最近10秒的值(10021处为4,10023处为7,10027处为2) – user5316628

+0

当你说'最后'时,你的意思是前10秒?因此,对于您的data.frame,第1行将是第1:1行的总和。第2行将是1:2行的总和。第3行将是1:3行的总和。第4行将是第3:4行的总和。第五行是5:5行的总和。第6行将是第5:6行的总和。第7行将是第7:7行的总和。我在这里了解你的目标吗? – SeldomSeenSlim

+0

是的,这是正确的。 – user5316628

定义一个函数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 

嗯,我是不是足够快,以在第一时间拿到答案,但这个解决方案更简单,并且不需要外部库。

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