2016-11-23 8 views
4

起こるところ私はdfと同様の構造で大きなdata.table、持つレコードを特定しますは、イベントの所定のシーケンスがx日以内

library("data.table") 
df <- data.frame(part = c("A", "B", "A", "C", "A", "D", "B", "D", "E"), 
       day = c(1, 2, 3, 4, 5, 6, 6, 7, 15), 
       code = c("S", "S", "P", "X", "P", "S", "P", "P", "P")) 
setDT(df) 
df 
    part day code 
1: A 1 S 
2: B 2 S 
3: A 3 P 
4: C 4 X 
5: A 5 P 
6: D 6 S 
7: B 6 P 
8: D 7 P 
9: E 15 P 

どのように私はcode = Sフラグレコード列を追加することができますをし、同じpartは、3日以内にcode = Pとなっていますか?期待される結果:

part day code flag 
1: A 1 S TRUE 
2: B 2 S FALSE 
3: A 3 P FALSE 
4: C 4 X FALSE 
5: A 5 P FALSE 
6: D 6 S TRUE 
7: B 6 P FALSE 
8: D 7 P FALSE 
9: E 15 P FALSE 

答えて

6

私は、これはそれが!is.na(x[i, which=TRUE])の仕組みそれ

df[, v := FALSE ] 
df[code == "S", v := !is.na(
    df[code == "P"][df[code == "S"], on=c("part", "day"), roll=-3, which=TRUE] 
)] 

    part day code  v 
1: A 1 S TRUE 
2: B 2 S FALSE 
3: A 3 P FALSE 
4: C 4 X FALSE 
5: A 5 P FALSE 
6: D 6 S TRUE 
7: B 6 P FALSE 
8: D 7 P FALSE 
9: E 15 P FALSE 

んだと思うがiの各行がxで試合を発見したかどうかを教えてくれる。 が複数の一致を検出した場合、これは分解される可能性があります。roll部分は、マッチの範囲を拡大して、最後に接続された列を含む行をカバーしますon

rollの値が正しいことがわかりません。この方法を使ったことがないからです。

+0

私は 'DF [コード== "S"]' 'の部分は.SD'をすべきだと思いますtoo-動作することができますが、それはエラーを与えました。私は切符を書きます。 – Frank

+0

提出:https://github.com/Rdatatable/data.table/issues/1926 – Frank

+0

非常に賢い。ありがとうございました。 – ddunn801

1

これは

df$v <- as.logical((df$code== "S") * 
     c(sapply(seq(1:(nrow(df)-2)), function(x) 
      { 
      max(df[(x:x+2),"code"] == "P") 
      }), 
      df[nrow(df)-1,"code"]=="P", 
      df[nrow(df),"code"]=="P")) 
+0

これはdata.table以外の良い選択肢です。私は後でこのファイルを保存します。ありがとうございました。 – ddunn801

関連する問題