下面是一个数据框,df它有1个变量ID,500K数据点,我需要实现一个event counter具有以下条件.
1.增量 event counter当ID == 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行的情况相同.
找到类似的问题,其中计数器在满足条件的每个数据点的遇到时递增,但是我的实现条件是不同的.
您可以将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 = 4和x == 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.
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |