2017-10-21 114 views
0

對於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

回答

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

嗯,我是不是足夠快,以在第一時間拿到答案,但這個解決方案更簡單,並且不需要外部庫。

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