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
dhfly 更改标题为「大白求教:获取相同元素下标」