我正在尝试从下面的数据框中选择值,其中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除以一行或多行的任何实例。
答案 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