这是一个“R”问题:
假设我有一个3个字母的向量,例如:“BBSSHHSRBSBBS”我想要找到的是“B”序列之后出现的第一个“S”的位置。例如,在“B”序列之后出现的第一个“S”上面的向量将出现在第3个位置的第10个位置和最后一个位置(13)
我可以轻松地使用循环,但我想知道是否有任何方法可以在“R”中完成而不进行循环。
该函数应该得到一个R向量作为输入,并返回“S”位置的向量作为输出
谢谢,
答案 0 :(得分:7)
另一个基础R解决方案
str <- "BBSSHHSRBSBBS"
pos <- unlist(gregexpr("BS", str))
请注意,gregexpr
接受正则表达式,因此您可以捕获更复杂的模式。
答案 1 :(得分:4)
也许使用str_locate_all:
library(stringr)
v <- "BBSSHHSRBSBBS"
str_locate_all(v, "BS")
[[1]]
start end
[1,] 2 3
[2,] 9 10
[3,] 12 13
答案 2 :(得分:3)
在基地R。
s <- "BBSSHHSRBSBBS"
sl <- strsplit(s, 'BS')[[1]]
pos <- nchar(sl[1]) + 2 # to get the S, 1 to get the B
答案 3 :(得分:2)
此版本也可用于输入“BHHS”
s1 <- "BBSSHHSRBSBBS"
s2 <- "BHHS"
spos <- function (s) {
pat <- "B[^S]*(S)"
m <- gregexpr(pat,s, perl=TRUE)
as.vector(attr(m[[1]], "capture.start"))
}
spos(s1)
spos(s2)