事件计数器有条件

Tar*_*eva 2 r

下面是一个数据框,df它有1个变量ID,500K数据点,我需要实现一个event counter具有以下条件.
1.增量 event counterID == A
2.但是,不应考虑前3个数据点用于计数器增量ID == A.
下面显示了df具有预期输出 的数据框

ID       Event Counter  
D          0  
F          0  
V          0
A          0  
A          0  
A          0
A          1  
A          1  
A          1
V          1  
F          1  
A          1
A          1
A          1  
A          2  
F          2  
G          2 
A          2  
A          2  
A          2  
A          3  
A          3  
Run Code Online (Sandbox Code Playgroud)

请注意: - 行号1,2和3不满足条件,因此没有增量Event Counter.虽然ID ==A在第4,5和6行中event counter不会增加(参考:条件2).第12,13和14行的情况相同.

找到类似的问题,其中计数器在满足条件的每个数据点的遇到时递增,但是我的实现条件是不同的.

tal*_*lat 5

您可以将zoo::rollsum此类任务结合使用rle:

library(zoo)
x <- rollsumr(df$ID == "A", k=4, fill = NA)
df$new <- with(rle(!is.na(x) & x == 4), rep(cumsum(values), lengths))
Run Code Online (Sandbox Code Playgroud)

k = 4x == 4在这种情况下意味着你需要3案件ID == "A"要增加了.您可以根据需要更改此号码.

结果等于您想要的输出:

all.equal(df$Event_counter, df$new)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

rle部分返回:

rle(!is.na(x) & x == 4)
#Run Length Encoding
#  lengths: int [1:6] 6 3 5 1 5 2
#  values : logi [1:6] FALSE TRUE FALSE TRUE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)

现在我们可以a)计算值的累积和,即0-1-1-2 ... b)使用rep我们重复这些值中的每一个与每个序列长的相同次数,即lengths.