Объединение двух фреймов данных с помощью stringmatch с помощью dplyr и stringdist - PullRequest
1 голос
/ 02 мая 2019

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

DF1:

title | records
Bob's show, part 1 | 42
Time for dinner | 77
Horsecrap | 121

DF2:

showname | counts
Bob's show part 1 | 772
Dinner time | 89
No way Jose | 123

Я выполняю это, чтобы получить расстояния строк как вектор, используя пакет / библиотеку строк:

titlematch <- amatch(df1$title,df2$showname) 

Вектор выглядит как ... ну, целочисленный вектор:

titlematch
1
2
NA

Обычно, если бы у меня были точные совпадения, я делал бы:

blended <- left_join(df1, df2, by = c("title" = "showname"))

Как мневыполните левое соединение, используя вектор в качестве селектора записи, чтобы конечный результат был:

title | records | showname | counts
Bob's show, part 1 | 42 | Bob's show part 1 | 772
Time for dinner | 77 | Dinner time | 89

С исключением третьего несоответствия, поскольку в векторе (NA) нет вероятного совпадения.

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Вот выстрел,

library(stringdist)
library(tidyverse)

df1 %>%
  as_tibble() %>%
  mutate(temp = amatch(title, df2$showname, maxDist = 10)) %>%
  bind_cols(df2[.$temp, ]) %>%
  select(-temp)

# A tibble: 3 x 4
  title              records showname          counts
  <chr>                <int> <chr>              <int>
1 Bob's show, part 1      42 Bob's show part 1    772
2 Time for dinner         77 Dinner time           89
3 Horsecrap              121 Dinner time           89

Я не могу воспроизвести ваш числовой совпадающий вектор, amatch(df1$title, df2$showname) дает мне [1] NA NA NA, так как похоже, что по умолчанию он равен 0,1, поэтому я установил maxDist в 10.

В конце вы всегда можете добавить %>% filter(is.na(showname)) для удаления любой строки, которая не соответствует.

данные

df1 <- structure(list(title = c("Bob's show, part 1", "Time for dinner", 
"Horsecrap"), records = c(42L, 77L, 121L)), .Names = c("title", 
"records"), row.names = c(NA, -3L), class = "data.frame")

df2 <- structure(list(showname = c("Bob's show part 1", "Dinner time", 
"No way Jose"), counts = c(772L, 89L, 123L)), .Names = c("showname", 
"counts"), row.names = c(NA, -3L), class = "data.frame")
0 голосов
/ 03 мая 2019

Камилла предлагается в комментарии :

Вы смотрели на fuzzyjoin?

Я никогда не слышал о fuzzyjoin раньше, но я пробовал это и любил это. stringdist_left_join было именно то, что мне нужно.

...