Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 确定给定事件序列在x天内发生的记录_R_Data.table - Fatal编程技术网

R 确定给定事件序列在x天内发生的记录

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

我有一个很大的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
我想这样就行了

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"))