Поиск значения на основе частичного совпадения строк в R - PullRequest
0 голосов
/ 01 мая 2020

У меня есть таблица (таблица 1) с кучей городов (пунктуация, заглавные буквы и пробелы были удалены).

Я хочу просканировать 2-ю таблицу (таблицу 2) и извлечь любую запись (первую), которая точно соответствует или содержит строку где-либо в ней.

# Table 1
  city1    
1 waterloo 
2 kitchener
3 toronto  
4 guelph   
5 ottawa


# Table 2
  city2
1 waterlookitchener  
2 toronto  
3 hamilton  
4 cityofottawa  

Это даст третью таблицу, показанную ниже.

# Table 3
  city1      city2
1 waterloo   waterlookitchener  
2 kitchener  waterlookitchener  
3 toronto    toronto  
4 guelph     <N/A>  
5 ottawa     cityofottawa

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Вы также можете попробовать использовать fuzzyjoin. В этом случае вы можете использовать функцию stri_detect_fixed из пакета stringi, чтобы идентифицировать хотя бы одно вхождение фиксированного шаблона в строку.

library(fuzzyjoin)
library(stringi)
library(dplyr)

fuzzy_right_join(table2, table1, by = c("city2" = "city1"), match_fun = stri_detect_fixed) %>% 
  select(city1, city2)

Вывод

      city1             city2
1  waterloo waterlookitchener
2 kitchener waterlookitchener
3   toronto           toronto
4    guelph              <NA>
5    ottawa      cityofottawa

Данные

table1 <- structure(list(city1 = c("waterloo", "kitchener", "toronto", 
"guelph", "ottawa")), class = "data.frame", row.names = c(NA, 
-5L))

table2 <- structure(list(city2 = c("waterlookitchener", "toronto", "hamilton", 
"cityofottawa")), class = "data.frame", row.names = c(NA, -4L
))
0 голосов
/ 01 мая 2020

Я считаю, что есть более сложные способы выполнить вашу задачу, но здесь есть простой подход, использующий tidyverse.

df <- read_table2("city1
waterloo
kitchener
toronto
guelph
ottawa")

df2 <- read_table2("city2
waterlookitchener
toronto
hamilton
cityofottawa")

df3 <- df$city1 %>% 
  lapply(grep, df2$city2, value=TRUE) %>%
  lapply(function(x) if(identical(x, character(0))) NA_character_ else x) %>%
  unlist

df3 <- cbind(df, df3)
  1. Поиск каждого элемента df$city1 в df2$city2 (частичное или полное совпадение) и вернуть этот элемент df2$city2. См. ?grep для получения дополнительной информации.

  2. Замените character(0) (элемент не найден) на NA. См. Как преобразовать символ (0) в NA в списке с языком R? для получения подробной информации.

  3. Преобразовать список в вектор (unlist).

  4. Прикрепить результат к списку городов (cbind).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...