特定の条件に基づいてdec_cnt
を1だけデクリメントするカウンタを実装する必要があります。減少する値のシーケンシャルカウンタを実装する
以下は私のデータフレームdf
です。
ID A
1 0
2 0
3 0
4 1
5 1
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 -1
17 1
18 0
19 1
20 0
21 -1
22 0
23 0
24 -1
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
条件が
です。カウンタはA==1 or -1
データポイントから開始し、デクリメントカウンタは、カウンタが0
になるまで値15
から出発して実施すべきであるID == 4
からID==19
までに、ID 4
でA == 1
の値の例のために、次16
値に対するカウンタをデクリメントを開始すべきです。また、この範囲の間にA== 1/-1
が存在する場合は、無視する必要があることにも注意してください。 b。また、A
の値を保持するretain_A
列を実装する必要があります。これはcounter
です。
以下は私の予想される出力です。
ID A retain_A dec_cnt
1 0 NA NA
2 0 NA NA
3 0 NA NA
4 1 1 15
5 1 1 14
6 0 1 13
7 0 1 12
8 0 1 11
9 0 1 10
10 0 1 9
11 0 1 8
12 0 1 7
13 0 1 6
14 0 1 5
15 0 1 4
16 -1 1 3
17 1 1 2
18 0 1 1
19 1 1 0
20 0 NA NA
21 -1 -1 15
22 0 -1 14
23 0 -1 13
24 -1 -1 12
25 0 -1 11
26 0 -1 10
27 0 -1 9
28 0 -1 8
29 0 -1 7
30 0 -1 6
31 0 -1 5
32 0 -1 4
33 0 -1 3
34 0 -1 2
ソリューションはloop
データポイント以上35
であれば実行に失敗した。また、for loop
を使用している質問の似たようなものは、数日前に投稿されていました。私はfor loop
を避けたかったのです。なぜなら、膨大な量のデータを処理するならば、実行時間が長くなるからです。
データフレームは、以下のhere
投稿を質問から取っている私は上記参照のポストを使用してみましたスクリプトです。
dec_cnt <- 0
Retain_A <- NA
for (i in seq_along(df$A)) {
if (dec_cnt == 0) {
if (df$A[i] == 0) next
dec_cnt <- 15
Retain_A <- df$A[i]
df$Retain_A[i] <- df$A[i]
df$dec_cnt[i] <- dec_cnt
} else {
dec_cnt <- dec_cnt - 1
df$Retain_A[i] <- Retain_A
df$dec_cnt[i] <- dec_cnt
}
}
最初の '1'と' -1'をすべて見つけて、その16行後にサブセットを入れて、シーケンス(および '1' /' -1')を追加してみませんか? 'dput()'のように貼り付けが簡単な形式であなたの例を提供できますか? –