2017-10-21 3 views
0

dfの場合、最後の10秒間の値のローリング・サムを秒単位で指定したいと思います。データフレームが非常に大きいので、dply :: completeを使用することはオプションではありません(何百万というデータポイント、ミリ秒レベル)。私はdplyrソリューションを好むが、datatable 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)) 

ソリューションは、過去10秒間のローリング合計をとる列(Sum.10S)を追加します。

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

コメントを反映するために3番目の数字を13に固定しました。したがって、3行目には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:5の合計になります。行6は行5:6の合計になります。行7は行7:7の合計ですか?あなたの目標をここで理解していますか? – SeldomSeenSlim

+0

はい、正しいです。 – user5316628

答えて

2

は、最後の10秒を加算し、rollapplyrでそれを使用する機能sum10を定義します。これは、明示的なループを回避し、質問のデータを使用して明示的なループより約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 
関連する問題