我有一个带有条件列的数据框。我想知道所有为 TRUE 的行以及下一行和上一行(没有重复项)的索引。
例如,如果我的数据框是
df = data.frame(x=c(TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE))
那么我想要 c(1, 2, 4, 5, 6, 7, 8)
。
当然
which(df$x)
会回来c(1, 5, 6, 8)
。我想添加 2
因为它位于第 1 行之后,即 TRUE
,4
因为它位于第 5 行之前,7
因为它位于第 6 行之前和第 8 行之后。
性能是一个问题,因为数据帧可能非常大。如果相关的话,第一个和最后一个值总是相同的。
您可以使用
dplyr
lead()
和 lag()
功能来提供帮助。基本上查找为 true 的行,或者前一个值为 true 的行,或者下一个值为 true 的行。
library(dplyr)
which(with(df, x | lead(x, 1, FALSE) | lag(x, 1, FALSE)))
# [1] 1 2 4 5 6 7 8