удалить повторяющиеся строки в последовательности строк и сохранить только те, которые появляются в последний раз - PullRequest
1 голос
/ 30 апреля 2020

У меня есть словарь слов. У меня также есть столбец в кадре данных, включающий последовательность комбинаций слов в словаре.
Я хочу удалить повторяющиеся слова и сохранить только те, которые появляются в последний раз в последовательности. Итак, у нас будет каждое уникальное слово, которое появится в его последний раз. Например, если словарь <- c ("A", "B", "C") и моя последовательность - mySeq <- "ABCCBCA", я хочу, чтобы результат был: "BCA" </p>

давайте попробуем это в следующих данных

dic<- c("AA","BB","c","p")

df<-read.table(text="
id  mySequece
1   AAcAABBcPAA
2   AABBAA
3   AABBAABB
4   AAcBBc
5   cBBAABBBBBBBB
6   cBBAABBBBcBB
7   ccp
8   ccppcc",header=T,stringsAsFactors = F)

desired result:

id  My_new_sequence
1   BBcPAA
2   BBAA
3   AABB
4   AABBc
5   cAABB
6   AAcBB
7   cp
8   pc

Как я могу сделать это в R?

1 Ответ

2 голосов
/ 30 апреля 2020

Мы можем извлечь элементы на основе '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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...