r - 根据列中两行之间的距离选择因素

标签 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 行)。谢谢。

此外,下面的解决方案似乎不适用于以下示例:

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 子集行
  • 然后by将剩余的行分组
  • 然后计算j

j里面我们有.I,为了方便存储行号;和 .Nby 组中的行数。所以要提取具有 V1 == TRUE 的 id,我们可以执行 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

关于r - 根据列中两行之间的距离选择因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39839816/

相关文章:

python - 在 Keras 模型中优化准确性而不是损失

r - 在 R : get multiple rows by splitting a column using tidyr and reshape2 中

r - 无法删除列 - select() with dplyr

r - 在 dplyr mutate_at 调用中使用多列函数

r - 在 R 中显示剪切类别,无需 e 格式

r - 在 R 中,如何同时将输出输出到文件和控制台?

R:在 R 中将数据框(混合因子和数字)转换为 XTS

r - 在 `dplyr` 中操作动态创建的变量名

R,dplyr : cumulative version of n_distinct

r - 如何将条件汇总为 R 中的单个变量?