Могу ли я найти положение в R, избегая цикла?

Это вопрос "R":

Предположим, что у меня есть вектор из трех букв, например: "BBSSHHSRBSBBS", что мне нравится находить, - это положение первого "S" , которое появляется после последовательности "B". Например, в векторе выше первый "S" , который появляется после последовательностей "B", появится в 3-м месте 10-го места и последнее место (13)

Я могу делать тривиально с помощью циклов, но мне нравится выяснять, есть ли способ сделать это в "R" без петлирования вообще.

Функция должна получить вектор R в качестве входа и вернуть вектор позиций "S" в качестве выходного

Спасибо,

4 ответа

Другое базовое решение R

str <- "BBSSHHSRBSBBS"
pos <- unlist(gregexpr("BS", str))

Обратите внимание, что gregexpr принимает регулярные выражения, чтобы вы могли поймать гораздо более сложные шаблоны.


Возможно, с str_locate_all:

library(stringr)
v <- "BBSSHHSRBSBBS"
str_locate_all(v, "BS")
[[1]]
 start end
[1,] 2 3
[2,] 9 10
[3,] 12 13


в базе R.

s <- "BBSSHHSRBSBBS"
sl <- strsplit(s, 'BS')[[1]]
pos <- nchar(sl[1]) + 2 # to get the S, 1 to get the B


Эта версия работает также для ввода типа "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)

licensed under cc by-sa 3.0 with attribution.