对于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)
答案 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