Как сопоставить частичные совпадения полей в двух наборах данных R с помощью dplyr - PullRequest
1 голос
/ 07 июня 2019

У меня есть два набора данных, и я пытаюсь создать набор данных на основе частичного совпадения двух полей из этих двух наборов данных.

Я использую фильтр dplyr и мне нужно найти частичные партиалы в каждой строке. Я пытался использовать str_replace(), но это не похоже на таблицу $ col.

Минимальный воспроизводимый пример:

library(dplyr)

id <- c('1','2','3')
code<- c('a1231','b3211','c9871985')

tbl<- data.frame(id,code)

other_cd <- c('a123','b321','c987')
other_cd <- data.frame(other_cd)



match <- tbl %>% dplyr::filter(code %in% other_cd$other_cd) %>%
  dplyr::summarise(count = n_distinct(id))

Ниже я попробовал использовать str_replace ()

fuzzy_match <- tbl %>% dplyr::filter(code %in% str_detect(other_cd$other_cd, "^[other_cd$other_cd]")) %>%
  dplyr::summarise(count = n_distinct(id))

Я бы хотел, чтобы fuzzy_match содержал 3 строки с частично подобранными элементами, поэтому вывод может выглядеть примерно так:

id        code      other_cd
1         a1231      a123
2         b3211      b321
3         c9871985   c987  

1 Ответ

2 голосов
/ 07 июня 2019

Мы могли бы paste элементы 'other_cd', разделенные |, для соответствия любому из элементов

library(dplyr)
library(stringr)
tbl %>%
     filter(str_detect(code, str_c(other_cd$other_cd, collapse="|"))) %>%
      summarise(count = n_distinct(id))

Обновление

В обновленном сообщении OP хочет создатьновый столбец из other_cd.В этом случае мы можем использовать str_extract

tbl %>% 
   mutate(other_cd = str_extract(code, str_c(other_cd$other_cd, collapse="|")))
#   id     code other_cd
#1  1    a1231     a123
#2  2    b3211     b321
#3  3 c9871985     c987

Или, если количество строк одинаковое

tbl %>% 
    filter(str_detect(code, as.character(other_cd$other_cd)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...