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

Это вопрос на букву "Р":

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

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

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

Спасибо,


r
person user1261321    schedule 10.03.2012    source источник


Ответы (4)


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

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

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

person nico    schedule 10.03.2012
comment
Мой разум не пошел туда, но мне очень нравится это решение. Очень гибкий. +1 - person Tyler Rinker; 10.03.2012
comment
Вам нужно добавить 1, чтобы найти первую S после B. - person John; 11.03.2012
comment
Это хорошо, но что произойдет, если у меня есть последовательность вида BHHS, она не сработает? потому что возврат должен быть в позиции 4? - person user1261321; 11.03.2012
comment
Если он ничего не найдет, он вернет -1. Если вы хотите разрешить символы между B и S, вы можете использовать выражение типа B(.)?S (или что-то в этом роде) - person nico; 11.03.2012

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

library(stringr)
v <- "BBSSHHSRBSBBS"
str_locate_all(v, "BS")
[[1]]
     start end
[1,]     2   3
[2,]     9  10
[3,]    12  13
person johannes    schedule 10.03.2012
comment
Вы захотите использовать там регулярное выражение вместо просто "BS" для неизбежного продолжения в случае, когда первая S после B не немедленно следует за B. - person joran; 10.03.2012

в базе Р.

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

Эта версия работает также для ввода типа «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)
person Karsten W.    schedule 11.03.2012
comment
не стесняйтесь принимать этот или любой другой ответ здесь, если ваша проблема решена :-) - person Karsten W.; 13.03.2012