R 确定给定事件序列在x天内发生的记录
我有一个很大的data.table,在结构上类似于R 确定给定事件序列在x天内发生的记录,r,data.table,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
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
我想这样就行了
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,它=TRUE])
告诉我们i
的每一行是否在x
中找到了匹配项。(如果i
找到多个匹配项,这可能会发生故障。)roll
部分扩展了匹配范围,以覆盖在上加入的最后一列附近的行
我不确定那里的roll
值是否正确,因为我从来没有这样使用过。这也可以-
df$v <- as.logical((df$code== "S") *
c(sapply(seq(1:(nrow(df)-2)), function(x)
{
max(df[(x:x+2),"code"] == "P")
}),
df[nrow(df)-1,"code"]=="P",
df[nrow(df),"code"]=="P"))
df$v我认为df[code==“S”]
部分应该是.SD
,但这给出了一个错误。我要开罚单。很聪明。谢谢。这是data.table之外的一个很好的选择。我会把这个归档,以后再归档。非常感谢。
df$v <- as.logical((df$code== "S") *
c(sapply(seq(1:(nrow(df)-2)), function(x)
{
max(df[(x:x+2),"code"] == "P")
}),
df[nrow(df)-1,"code"]=="P",
df[nrow(df),"code"]=="P"))