qq=c("a","b","b","a","b","b","b","b","a","b","b","b","a")
如何获取3个及以上连续"b"的索引。思路是:qq==qq[i+1]==qq[i+2],但自己写的for循环实现不了。

library(data.table)

dt <- data.table(qq=c("a","b","b","a","b","b","b","b","a","b","b","b","a"))

dt[,id:=rleid(qq)
   ][,count:=.N,by=.(id)
     ][count>=3 & qq=="b",which=TRUE]
#> [1]  5  6  7  8 10 11 12

<sup>Created on 2020-05-10 by the reprex package (v0.3.0)</sup>

或者for loop

qq=c("a","b","b","a","b","b","b","b","a","b","b","b","a")

result <- integer(length(qq))
for (i in 3:length(qq)) {
  if (all(qq[(i-2):i]=="b")) {
    result[(i-2):i] <- (i-2):i
  }
}

result[result!=0]
#> [1]  5  6  7  8 10 11 12

<sup>Created on 2020-05-10 by the reprex package (v0.3.0)</sup>

或者考虑将向量改为字符串,利用正则表达式进行操作,代码如下:
`
qq<-c("a","b","b","a","b","b","b","b",
"a","b","b","b","a")
qq_str<-paste0(qq,collapse = "")

library(stringr)
three_b<-str_locate_all(qq_str,pattern='b{3,}')
g<-function(x){return(seq(x[1],x[2],by=1))}
apply(three_b[[1]],1,g)

`
结果为
[[1]]
[1] 5 6 7 8

[[2]]
[1] 10 11 12

4 天 后
dhfly 更改标题为「大白求教:获取相同元素下标