我有一个大的 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

如何在随后的 3 天内添加标记 code = S 且相同 part 具有 code = P 的记录的列?预期结果:
   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

最佳答案

我认为这样做

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

它是如何工作的 !is.na(x[i, which=TRUE]) 告诉我们 i 的每一行是否在 x 中找到匹配项。 (如果 i 找到多个匹配项,这可能会崩溃。) roll 部分扩展了匹配范围以涵盖就连接的最后一列而言附近的行 on

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

关于r - 识别在 x 天内发生给定事件序列的记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40772423/

10-13 07:24