2
私は以下のようなデータテーブルを持っています。 vals
が0
で他の場所にない場合、フラグは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
のようにしたいと思います。つまり、列は、vals
が0
の場合は1から始まり、vals
が0
の場合は次の行までカウントアップする一連のシーケンスを含む必要があります。 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
改善が認められます。