R 基于列中两行之间的距离选择因子

R 基于列中两行之间的距离选择因子,r,dplyr,R,Dplyr,我试图从下面的数据框中选择在num列中值为2且至少相隔2行的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) 如何选择id变量,使2的值至少被一行分隔 我正在寻找的过程的结果将选择id 1,因为在本例中,2的值至少由一行2行分

我试图从下面的数据框中选择在num列中值为2且至少相隔2行的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)
如何选择id变量,使2的值至少被一行分隔

我正在寻找的过程的结果将选择id 1,因为在本例中,2的值至少由一行2行分隔。谢谢

此外,下面的解决方案似乎对以下示例不起作用:

df <- data.frame(
  id=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4),
  num=c(1,2,1, 1,2,2, 1,1,1,2,2,1, 1,1,1,2,2,1, 1,2,1,2,2,2)
)     
df$id<-as.factor(df$id) 
同样,结果应仅为id 1。我只想根据ID查找数字2被另一个2以一行或多行分隔的任何实例。

data.table我将使用data.table包:

library(data.table)
setDT(df)

df[num == 2, .N > 1L && any(diff(.I) > 2L), by=id]

   id    V1
1:  1  TRUE
2:  2 FALSE
3:  3 FALSE
工作原理:语法是DT[i,j,by]

i子集行 然后将剩余的行分组 然后计算j 在j里面有.I,为了方便起见,它存储了行数;和.N,按组中的行数。所以要提取id have V1==TRUE,我们可以执行res[V1==TRUE,id]。或者,整个操作可以像

df[num == 2, .N > 1L && any(diff(.I) > 2L), by=id][V1 == TRUE, id]

[1] 1
Levels: 1 2 3
base或dplyr base R中的几乎类似物为

sapply(split(df$num == 2, df$id), function(x){
  w = which(x)
  length(w) > 1L && any(diff(w) > 2L) 
})

    1     2     3 
 TRUE FALSE FALSE 
后者也适用于dplyr

library(dplyr)

df %>% group_by(id) %>% summarise(x = {
  w = which(num == 2)
  length(w) > 1L && any(diff(w) > 2L) 
})

# A tibble: 3 x 2
      id     x
  <fctr> <lgl>
1      1  TRUE
2      2 FALSE
3      3 FALSE

更正,谢谢。第二个示例的预期输出是什么?与第一个相同。我只想根据ID查找数字2被另一个2和一行或多行分隔的任何实例。Ok。一般来说,最好从一开始就明确此类需求。我将其读取为所有值,而不是任何值,因为您没有指定它。我认为修改后的答案可能有效。如果数据框为以下形式,您的解决方案是否可以推广:df@user85727你能把它作为问题中的另一个例子吗?很难从您的评论中复制粘贴。不确定anydiffw>2L是否正常工作,可能需要使用anydiffw>1L@user85727如果它被切换到1,那么id 4也被标识为true,但是您说它应该为false,所以我推断出不同的阈值。通常,如果您在问题中以非常明确的方式包含所需的输出及其背后的规则,通常可以避免这种混淆。您的代码给了我错误:将左侧设置为赋值无效:>librarydplyr>>df%>%groupbyid%>%summarysex={+w=whichnum==2+纵向>1L&&anydiffw>2L+}