根据列中两行之间的距离选择因子

时间:2016-10-03 20:23:51

标签: r dplyr

我正在尝试从下面的数据框中选择值,其中num列中的值为2,至少相隔2行。换句话说,给定以下数据框:

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除以一行或多行的任何实例。

1 个答案:

答案 0 :(得分:6)

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

pack3

工作原理:语法为.dz-max-files-reached { pointer-events: none; cursor: default; }

  • 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

by内,我们有j,为方便起见,它存储了行号;和j.I组中的行数。因此要提取ID .N,我们可以by。或者,整个操作可以链接为

V1 == TRUE

base或dplyr 基础R中的(几乎)类似物

res[V1 == TRUE, id]

后者也适用于dplyr

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

[1] 1
Levels: 1 2 3