繁体   English   中英

使用data.table扩展到先前的查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM