[英]Extension to previous inquiry using data.table
以前,向我展示了一个解决方案,该问题是如何使用数据表来选择ID的行,该ID连续2行,随后任何一行1行,这些ID按ID分组:
df2 <- data.frame(id=c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,3),
num=c(1,2,1,1,2,1,1,1,2,2,1,1,1,2,2))
df2$id <- as.factor(df2$id)
解决方案是
library(data.table)
setDT(df2)
df2[, Position(I,num==2) < Position(I,num < 2,right=TRUE,nomatch=FALSE), by=id]
我想知道现在是否有一种方法可以使用data.table选择包含值2后面跟有1的实际ROWS(或其索引),而不是上面的解决方案, 如果存在这样的顺序,它只会返回ID 。
谢谢。
这可以通过获取行索引( .I
),然后基于该索引进行子集来完成
df2[df2[, .I[Position(I,num==2) < Position(I,num < 2,right=TRUE,nomatch=FALSE)], by=id]$V1]
基于OP的声明,我最初的想法是获取满足基于Position
的条件的“ id”行。 因此,在这种情况下,将返回值在“ num”中的“ id”(其中1后面是2)的整行。
但是,如果我们希望每个“ id”的索引为“ 2”,后跟“ 1”,则可以使用
setDT(df2)[, .I[num==2 & shift(num, type = "lead", fill=0)==1], id]$V1
#[1] 2 10
如果我们不仅要检查后续值,还要检查特定“ id”的第一个“ 2”值之后的值
setDT(df2)[, {i1 <- which(num==2)[1]; if(any(num[pmin(i1+1, .N):.N]==1)) .I[i1] } , id]$V1
#[1] 2 10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.