2017-01-26 10 views
2

私は以下のようなデータテーブルを持っています。 vals0で他の場所にない場合、フラグは1です。RデータテーブルのシーケンスでのNA値の入力

dt <- data.table(vals = c(0,2,4,1,0,4,3,0,3,4)) 
dt[vals == 0, flag := 1] 

> dt 
    vals flag 
1: 0 1 
2: 2 NA 
3: 4 NA 
4: 1 NA 
5: 0 1 
6: 4 NA 
7: 3 NA 
8: 0 1 
9: 3 NA 
10: 4 NA 

出力をseqのようにしたいと思います。つまり、列は、vals0の場合は1から始まり、vals0の場合は次の行までカウントアップする一連のシーケンスを含む必要があります。 flagは、説明された目標を達成するのに役立つ場合にのみ役立ちます。

> dt 
    vals seq 
1: 0 1 
2: 2 2 
3: 4 3 
4: 1 4 
5: 0 1 
6: 4 2 
7: 3 3 
8: 0 1 
9: 3 3 
10: 4 3 

もともと、私は何とかcumsum()を使用して考えていたが、私は効果的にそれを使用する方法を見つけ出すことはできません。

私の現在の解決策はかなり醜いです。

dt <- data.table(vals = c(0,2,4,1,0,4,3,0,3,4)) 
dt[vals == 0, flag := 1] 
dt[, flag_rleid := rleid(flag)] 

# group on the flag_rleid column 
dt[, flag_seq := seq_len(.N), by = flag_rleid] 
# hideous subsetting to avoid incrementing the first appearance of a 1 
dt[vals != 0, flag_seq := flag_seq + 1] 

# flag_seq is the desired column 
> dt 
    vals flag flag_rleid flag_seq 
1: 0 1   1  1 
2: 2 NA   2  2 
3: 4 NA   2  3 
4: 1 NA   2  4 
5: 0 1   3  1 
6: 4 NA   4  2 
7: 3 NA   4  3 
8: 0 1   5  1 
9: 3 NA   6  2 
10: 4 NA   6  3 

改善が認められます。

答えて

2

私たちは、グループ化変数を作成するためにcumsumとの論理インデックスを使用して、我々は、シーケンスcolumに

dt[, flag_seq := seq_len(.N), cumsum(vals ==0)] 
dt 
# vals flag flag_seq 
# 1: 0 1  1 
# 2: 2 NA  2 
# 3: 4 NA  3 
# 4: 1 NA  4 
# 5: 0 1  1 
# 6: 4 NA  2 
# 7: 3 NA  3 
# 8: 0 1  1 
# 9: 3 NA  2 
#10: 4 NA  3 
を得ることに基づいてすることができます
関連する問題