Последовательное сопоставление символов и извлечение с позиции - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь написать общий код в R, где я ищу 2 (или более в будущем) явных символа в определенном порядке, расположенном последовательно в векторе.Каждая команда, которую я пробую, будет возвращать совпадение только для первого символа.

У меня есть строка символов, похожая на данные, и я хочу извлечь позиции, в которых буквы "L" и "V" расположены рядом друг с другом только в этом порядке.Таким образом, единственные совпадения, которые у меня есть, должны быть позициями 3 и 4 и 7 и 8;Однако я верну позиции 1, 3 и 7 в качестве совпадения для L. Можно ли вернуть только совпадения "LV"?

Воспроизводимые данные для работы с:

data <- c("L", "D", "L", "V", "A", "V", "L", "V")

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вот несколько возможностей:

which(ts(data) == "L" & stats::lag(ts(data)) == "V")
## [1] 3 7

which(head(data, -1) == "L" & tail(data, -1) == "V")
## [1] 3 7

which(apply(t(embed(data, 2)) == c("V", "L"), 2, all))
## [1] 3 7

which(data == "L" & dplyr::lead(data) == "V")
## [1] 3 7
0 голосов
/ 09 октября 2018

Вектор data можно сначала свернуть в одну строку с помощью paste.Тогда мы можем найти стартовые позиции с помощью gregexpr.После этого мы можем сформировать список начальной и конечной точек, объединив результат из gregexpr с откорректированным атрибутом длины совпадения.

x <- gregexpr("LV", paste(data, collapse = ""))[[1]]
Map(c, x, x + attr(x, "match.length") - 1)
# [[1]]
# [1] 3 4
#
# [[2]]
# [1] 7 8
...