查找并返回列表中某些数字的索引

问题描述 投票:-1回答:3

我有一个列表,我想找到所有确定的数字组合。我怎样才能做到这一点?例如,如果我有

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,即组合的结尾吗?

r pattern-matching
3个回答
0
投票

我们可以找到a == 1a的前一个值也是1:

which(a == 1 & c(NA, head(a, -1)) == 1)

([c(NA, head(a, -1))有点笨重,可以用dplyr::lag(a)代替]


0
投票

我们也可以使用diff找到1的出现位置的差异。

a1 <- which(a == 1)
a1[-1][diff(a1) == 1]
#[1]  5 10

0
投票

我们可以使用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)

注意:这适用于数字和字符向量

© www.soinside.com 2019 - 2024. All rights reserved.