Вы можете выполнить свою задачу с помощью простого вызова str_extract
из пакета stringr :
library(stringr)
strings <- c("ABBSDGNHNGA", "AABSDGDRY", "AGNAFG", "GGGDSRTYHG")
str_extract(strings, '([^AGN]*[AGN]){3}')
# [1] "ABBSDGN" "AABSDG" "AGN" "GGG"
Часть [^AGN]*[AGN]
шаблона регулярного выражения говорит, что нужно искать нольили более последовательных символов, которые не являются A, G или N, за которыми следует один экземпляр A, G или N. Дополнительная обертка с круглыми скобками и фигурными скобками, например ([^AGN]*[AGN]){3}
, означает, что нужно искать этот шаблон три раза подряд.Вы можете изменить количество вхождений A, G, N, которое вы ищете, изменив целое число в фигурных скобках:
str_extract(strings, '([^AGN]*[AGN]){4}')
# [1] "ABBSDGNHN" NA "AGNA" "GGGDSRTYHG"
Есть несколько способов выполнить вашу задачу с использованием базовых функций R,Одним из них является использование regexpr
, за которым следует regmatches
:
m <- regexpr('([^AGN]*[AGN]){3}', strings)
regmatches(strings, m)
# [1] "ABBSDGN" "AABSDG" "AGN" "GGG"
В качестве альтернативы вы можете использовать sub
:
sub('(([^AGN]*[AGN]){3}).*', '\\1', strings)
# [1] "ABBSDGN" "AABSDG" "AGN" "GGG"