2016-07-19 2 views
1

私はthis questionと尋ねていましたが、イベントの前に負の数を生成するのに最適な以下の解決策を得ました。別のイベントの後で新しい列に数値を生成

library(data.table) 
    setDT(df1)[, event_lead:=-(.N:1) ,cumsum(event == 1) 
    ][, event_lead := event_lead* (!event)] 
    df1 
    # var1 var2 event event_lead 
    # 1: 0.658 72.193  0   -5 
    # 2: 0.641 70.217  0   -4 
    # 3: 0.641 40.173  0   -3 
    # 4: 0.652 52.687  0   -2 
    # 5: 0.531 50.652  0   -1 
    # 6: 0.529 39.497  1   0 
    # 7: 0.651 29.291  0   -4 
    # 8: 0.634 59.548  0   -3 
    # 9: 0.711 51.925  0   -2 
    #10: 0.635 75.772  0   -1 
    #11: 0.710 53.378  1   0 
    #12: 0.660 87.744  0   -3 
    #13: 0.540 62.547  0   -2 
    #14: 0.618 38.050  0   -1 
    #15: 0.602 60.978  1   0 

このコードを調整して、イベント後に別の列の正の数値を取得しようとしています。

> setDT(df1)[, event_lead:=-(.N:1) ,cumsum(event == 1) 
    +   ][, event_lead := event_lead* (!event)] 


    > setDT(df1)[, event_follow:=+(1:.N) ,cumsum(event == 1) 
    +   ][, event_follow := event_follow* (!event)] 

    > df1 
     var1 var2 event event_lead event_follow 
    1: 0.658 72.193  0   -5   1 
    2: 0.641 70.217  0   -4   2 
    3: 0.641 40.173  0   -3   3 
    4: 0.652 52.687  0   -2   4 
    5: 0.531 50.652  0   -1   5 
    6: 0.529 39.497  1   0   0 
    7: 0.651 29.291  0   -4   2 
    8: 0.634 59.548  0   -3   3 
    9: 0.711 51.925  0   -2   4 
    10: 0.635 75.772  0   -1   5 
    11: 0.710 53.378  1   0   0 
    12: 0.660 87.744  0   -3   2 
    13: 0.540 62.547  0   -2   3 
    14: 0.618 38.050  0   -1   4 
    15: 0.602 60.978  1   0   0 

なぜそれがevent_follow0後の1をスキップしないし、私はそれをどのように修正することができますか?

+0

入力データセットはどれですか – akrun

+0

入力は[この最初の質問]と同じです(http://stackoverflow.com/questions/38387475/generate-numbers-before-an-event) – pyne

+0

ありがとうございます、それは 'event_follow'またはあなたが得たものコードと変更したい。それが後者の場合は、予期していることを示すことが良いです – akrun

答えて

1

我々は、それはevent_follow 'に(:=)を「イベント」の論理ベクトルと行の順序を乗算し、割り当て、論理ベクトル(event ==1)のlagcumsumを取ることによって、グループ化変数を作成することができます。 OPのポストで

df1[, event_follow := seq_len(.N) * !event ,cumsum(shift(event ==1, fill = FALSE))] 
df1 
#  var1 var2 event event_lead event_follow 
# 1: 0.658 72.193  0   -5   1 
# 2: 0.641 70.217  0   -4   2 
# 3: 0.641 40.173  0   -3   3 
# 4: 0.652 52.687  0   -2   4 
# 5: 0.531 50.652  0   -1   5 
# 6: 0.529 39.497  1   0   0 
# 7: 0.651 29.291  0   -4   1 
# 8: 0.634 59.548  0   -3   2 
# 9: 0.711 51.925  0   -2   3 
#10: 0.635 75.772  0   -1   4 
#11: 0.710 53.378  1   0   0 
#12: 0.660 87.744  0   -3   1 
#13: 0.540 62.547  0   -2   2 
#14: 0.618 38.050  0   -1   3 
#15: 0.602 60.978  1   0   0 

1があるwhereever、「event_follow」が1である「イベント」の累積和を使用して作成されたので、新しいグループが開始されます。

df1[, event_follow1 := +(1:.N) ,cumsum(event == 1)] 
df1$event_follow1 
#[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 1 

which(df1$event ==1) 
#[1] 6 11 15 

の出力を確認すると、6番目、11番目、15番目の要素が新しいシーケンスの開始点になります。新しい条件event_follow* (!event)を掛け合わせると、つまり、 'イベント'の1がある場所は論理ベクトルでFALSEなので、 'event_follow'の要素はすべて0になります。

+0

ありがとう、akrun!最初のものが1をスキップしていた理由を教えていただけますか? – pyne

+1

ありがとう、もう一度@akrun。非常に高く評価。 – pyne

関連する問題