识别在x天内发生给定事件序列的记录

ddu*_*801 4 r data.table

我有一个大的data.table,结构类似于df:

library("data.table")
df <- data.frame(part = c("A", "B", "A", "C", "A", "D", "B", "D", "E"), 
                 day = c(1, 2, 3, 4, 5, 6, 6, 7, 15), 
                 code = c("S", "S", "P", "X", "P", "S", "P", "P", "P"))
setDT(df)
df
   part day code
1:    A   1    S
2:    B   2    S
3:    A   3    P
4:    C   4    X
5:    A   5    P
6:    D   6    S
7:    B   6    P
8:    D   7    P
9:    E  15    P
Run Code Online (Sandbox Code Playgroud)

我怎样才能增加一列,标记记录,其中code= S和同样part具有code= P在3以后的日子里?预期结果:

   part day code  flag
1:    A   1    S  TRUE
2:    B   2    S FALSE
3:    A   3    P FALSE
4:    C   4    X FALSE
5:    A   5    P FALSE
6:    D   6    S  TRUE
7:    B   6    P FALSE
8:    D   7    P FALSE
9:    E  15    P FALSE
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 6

我认为这样做

df[, v := FALSE ]
df[code == "S", v := !is.na(
  df[code == "P"][df[code == "S"], on=c("part", "day"), roll=-3, which=TRUE]
)]

   part day code     v
1:    A   1    S  TRUE
2:    B   2    S FALSE
3:    A   3    P FALSE
4:    C   4    X FALSE
5:    A   5    P FALSE
6:    D   6    S  TRUE
7:    B   6    P FALSE
8:    D   7    P FALSE
9:    E  15    P FALSE
Run Code Online (Sandbox Code Playgroud)

它是如何工作的 !is.na(x[i, which=TRUE])告诉我们每一行是否i找到匹配x.(如果i找到多个匹配项,这可能会分解.)该roll部分扩展了匹配范围,以覆盖最后一列所连接的行on.

我不确定那里的roll值是否正确,因为我从未使用过这种方式.