Мы можем извлечь элементы на основе 'di c', затем использовать duplicated
, чтобы удалить дубликаты с конца, и paste
это вместе
library(dplyr)
library(stringr)
library(purrr)
df %>%
mutate(mySequece = str_extract_all(mySequece, str_c(dic, collapse="|")) %>%
map_chr(~ str_c(.x[!duplicated(.x,
fromLast = TRUE)], collapse="")))
# id mySequece
#1 1 BBcAA
#2 2 BBAA
#3 3 AABB
#4 4 AABBc
#5 5 cAABB
#6 6 AAcBB
#7 7 cp
#8 8 pc
Или используя base R
sapply(regmatches(df$mySequece, gregexpr(paste(dic, collapse="|"),
df$mySequece)), function(x)
paste(x[!duplicated(x, fromLast = TRUE)], collapse=""))
#[1] "BBcAA" "BBAA" "AABB" "AABBc" "cAABB" "AAcBB" "cp" "pc"
data
df <- structure(list(id = 1:8, mySequece = c("AAcAABBcPAA", "AABBAA",
"AABBAABB", "AAcBBc", "cBBAABBBBBBBB", "cBBAABBBBcBB", "ccp",
"ccppcc")), class = "data.frame", row.names = c(NA, -8L))