2017-01-23 3 views
4

私は時系列を保存するためにRのdata.tableを使用しています。私は、選択された時間の連続する行が、選択された最後の行から少なくともN秒離れているようなサブセットを返したいとします。私は 選択された行が一定の最小時間だけ異なるように時系列をサブセット化

library(data.table) 
x <- data.table(t=c(0,1,3,4,5,6,7,10,16,17,18,20,21), v=1:13) 
x 
    t v 
1: 0 1 
2: 1 2 
3: 3 3 
4: 4 4 
5: 5 5 
6: 6 6 
7: 7 7 
8: 10 8 
9: 16 9 
10: 17 10 
11: 18 11 
12: 20 12 
13: 21 13 

を持っていると私は、最初の行から始まる離れて少なくとも5秒は、ある行をサンプリングしたい場合は、私は時間/値ペアでdata.tableを取得する必要があります:

y <- x[...something...] 
y 
    t v 
1: 0 1 
2: 5 5 
3: 10 8 
4: 16 9 
5: 21 13 

時間のサンプルは規則的に間隔を置く必要はないので、私はすべてのM行をとることはできません。もちろん、私はdata.tableの行を手動でループすることでこれを行うことができますが、data.tablesのインデックスを使用してこれを表現するより便利な方法があるのだろうかと思います。ここで

答えて

4

は、ローリングは、あなたのサブセットで、行、wのセットを見つけるために参加し、使用するカップルの方法があります。

t_plus = 5 

# one join per row visited 
w <- c() 
nxt <- 1L 
while(!is.na(nxt)){ 
    w <- c(w, nxt) 
    nxt <- x[.(t[nxt]+t_plus), on=.(t), roll=-Inf, which=TRUE] 
} 

# join once on all rows 
w0 <- x[.(t+5), on=.(t), roll=-Inf, which=TRUE] 

w <- c() 
nxt <- 1L 
while (!is.na(nxt)){ 
    w <- c(w, nxt) 
    nxt <- w0[nxt] 
} 

次にあなたがx[w]のようにサブセットすることができます。


コメント原則として

、OPの条件を満たし、他のサブセット「離れて、少なくとも5秒」があるかもしれません。これは最初の行から順方向に進むことによって見つけられたものです。

第2の方法は、上記のHenrikとリンクしたQ &の@DavidArenburg's answerに基づいています。質問は同じように見えますが、私はそのアプローチをここで完全に働かせることはできませんでした。

一般的に、私はwでやっているように、Rのループで物事を成長させるのは悪い考えです。パフォーマンスの問題に遭遇している場合は、このコードで改善するのがよいかもしれません。

+0

'findInterval'のようなものがここでも動作するはずですが、私はそれを理解できません。 – Frank

+0

Yikes、私は答えを「いいえ」としていますが、このための便利な索引付けのパラダイムはありません。私のRの実装がボトルネックになったら、おそらくそれをRcppに委託するだけです。助けてくれてありがとう。 – Anthony

+0

@Anthonyええ、私はあなたが便利な方法ではないと思っていますが、ルールの複雑さを過小評価していると思います。 "最大セット"の部分を気にしない場合、それはずっと簡単になり、繰り返し計算する必要はありません: 'x [x [。(t = seq(t [1L]、t [.N ]、= 5 * 2))、on =。(t)、roll = TRUE、TRUE、mult = "first"]] '10秒間隔ごとに1つの値を選択するet voila - あなたの状態満足している。とにかく、あなたが良いRcppの方法を見つけたら、それを私たちが見ることができるように答えとして投稿することができます。 – Frank

関連する問題