我可以在避免循环的同时找到R中的位置吗?

时间:2012-03-10 17:45:48

标签: r

这是一个“R”问题:

假设我有一个3个字母的向量,例如:“BBSSHHSRBSBBS”我想要找到的是“B”序列之后出现的第一个“S”的位置。例如,在“B”序列之后出现的第一个“S”上面的向量将出现在第3个位置的第10个位置和最后一个位置(13)

我可以轻松地使用循环,但我想知道是否有任何方法可以在“R”中完成而不进行循环。

该函数应该得到一个R向量作为输入,并返回“S”位置的向量作为输出

谢谢,

4 个答案:

答案 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)