我需要實現一個計數器,它根據某些條件將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
和在ID 4
開始遞減下一16
值計數器,用於A == 1
例如值開始,所以從ID == 4
直到ID==19
遞減計數器應當執行從值15
開始直到計數器是0
。另外要注意的是,如果在此範圍之間存在任何A== 1/-1
,則應該忽略它。 b。我還需要執行retain_A
列,其中保留價值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
類似的各種問題已張貼前兩天在解決方案使用for loop
,另外,loop
失敗如果數據點都超過35
執行。我想避免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()'? –