Найти совпадения между двумя строковыми столбцами в R - PullRequest
2 голосов
/ 23 сентября 2019

Чтобы решить проблему миграции тегов, я должен сравнить два столбца символов и оценить, есть ли совпадения между этими двумя столбцами или нет.

Подвести итог, учитывая такой кадр данных:

old_tags            new_tags
burger              burger, american
italian, pizza      italian
latin, peruvian     peruvian, latin
french              pizza

Я хотел бы добавить третий столбец, подобный этому:

old_tags            new_tags            match
burger              burger, american    TRUE
italian, pizza      italian             TRUE
latin, peruvian     peruvian, latin     TRUE
french              pizza               FALSE

До сих пор я безуспешно пытался использовать такие функции, как str_match, str_detect искоро.Обычно он возвращает FALSE при сравнении пар строк, которые на самом деле должны быть TRUE, например, в примере, который я привел [3,].

Заранее большое спасибо.

Ответы [ 3 ]

2 голосов
/ 23 сентября 2019

Один базовый подход R может быть разделить строку на запятую.Используя Map, найдите пересекающиеся слова и создайте логическое значение, если есть хотя бы одно значение, которое пересекается.

df$match <- lengths(Map(intersect, strsplit(df$old_tags, ", "), 
                    strsplit(df$new_tags, ", "))) > 0

df
#         old_tags         new_tags match
#1          burger burger, american  TRUE
#2  italian, pizza          italian  TRUE
#3 latin, peruvian  peruvian, latin  TRUE
#4          french            pizza FALSE

data

df <- structure(list(old_tags = c("burger", "italian, pizza", "latin, peruvian", 
"french"), new_tags = c("burger, american", "italian", "peruvian, latin", 
"pizza")), row.names = c(NA, -4L), class = "data.frame")
1 голос
/ 23 сентября 2019

A tidyverse - base возможность:

library(dplyr)
library(stringr)

df %>% 
   mutate(patterns = map_chr(strsplit(old_tags, ", "),paste,collapse="|"),
          Match = str_detect(new_tags, patterns)) %>% 
   select(-patterns)
         old_tags         new_tags Match
1          burger burger, american  TRUE
2  italian, pizza          italian  TRUE
3 latin, peruvian  peruvian, latin  TRUE
4          french            pizza FALSE
0 голосов
/ 23 сентября 2019

Или мы можем сделать str_extract с any

library(tidyverse)
df %>% 
   mutate(match = map2_lgl(str_extract_all(old_tags, "\\w+"), 
               str_extract_all(new_tags, "\\w+"),  ~ any(.x %in% .y)))
#         old_tags         new_tags match
#1          burger burger, american  TRUE
#2  italian, pizza          italian  TRUE
#3 latin, peruvian  peruvian, latin  TRUE
#4          french            pizza FALSE

data

df <- structure(list(old_tags = c("burger", "italian, pizza", "latin, peruvian", 
"french"), new_tags = c("burger, american", "italian", "peruvian, latin", 
"pizza")), row.names = c(NA, -4L), class = "data.frame")
...