我有一个列表,我想找到所有确定的数字组合。我怎样才能做到这一点?例如,如果我有
a <- c(1,3,5,1,1,5,3,2,1,1,2,3,4)
并且我想在此列表中找到所有的'1,1',如何返回所有索引?就像第一个'1,1'是第4个和第5个元素,第二个'1,1'是第9个和第10个元素一样,我可以编写代码以返回5和9,即组合的结尾吗?
我们可以找到a == 1
和a
的前一个值也是1:
which(a == 1 & c(NA, head(a, -1)) == 1)
([c(NA, head(a, -1))
有点笨重,可以用dplyr::lag(a)
代替]
我们也可以使用diff
找到1的出现位置的差异。
a1 <- which(a == 1)
a1[-1][diff(a1) == 1]
#[1] 5 10
我们可以使用rleid
中的data.table
library(data.table)
data.table(a)[, .I[a== 1 & .N == 2], .(grp = rleid(a))]$V1
#[1] 4 5 9 10
如果需要放在list
中
d1 <- data.table(a)[, .I[a== 1 & .N == 2], .(grp = rleid(a))]
split(d1$V1, d1$grp)
可以包装成函数
f1 <- function(vec, val, len) {
data.table(v1 = vec)[, .I[v1 == val & .N == len], .(grp = rleid(v1))]$V1
}
f1(a, 1, 2)
#[1] 4 5 9 10
b <- c(1, 2, 3, 1, 1, 1, 3, 2, 1, 1, 1, 1, 3, 1, 1, 1, 2)
f1(b, 1, 3)
#[1] 4 5 6 14 15 16
或base R
选项为
unlist(gregexpr('11', paste(a, collapse=''))) + rep(0:1, each = 2)
注意:这适用于数字和字符向量