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