Как я могу совместить нечеткую строку с несколькими строками из фреймов данных разного размера?

Я хотел бы сопоставить строки из моего первого набора данных со всеми их ближайшими общими совпадениями.

Данные выглядят так:

набор данных1:

California 
Texas 
Florida 
New York

набор данных2:

Californiia 
callifoornia
T3xas
Te xas
texas
Fl0 rida
folrida
New york
new york

желаемый результат:

col_1                col_2              col_3            col4
California           Californiia        callifoornia
Texas                T3xas              texas            Te xas
Florida              folrida            Fl0 rida
New York             New york           new york

Вопрос в том:

  • Как найти общие строки между первым набором данных и вторым набором данных и создать список терминов во втором наборе данных, которые совпадают с каждым термином в первом?

Заранее спасибо.


person Tim    schedule 22.04.2019    source источник
comment
Определите ближайший. Что релевантного обнаружилось в вашем исследовании в отношении таких представлений о близости? Как вы предоставляете это в своей программе? Как только вы получите таблицу со столбцами для правильного и нечеткого определения, знаете ли вы, как выполнить отдельный шаг преобразования нескольких строк в строку с несколькими столбцами? — Здесь вы действительно задаете 2 вопроса. Оба, очевидно, часто задаваемые вопросы. Что нашли на SO о каждом? Что ты умеешь делать?   -  person philipxy    schedule 23.04.2019
comment
См. stringdist пакет и dcast в data.table. Есть способ сделать это красиво в R, но у меня нет времени писать код прямо сейчас. stringdist относительно легко использовать с некоторыми базовыми отбивными R.   -  person JMT2080AD    schedule 23.04.2019
comment
Много соответствующей информации в Stackoverflow, например: приблизительное совпадение"> stackoverflow.com/questions/27975705/ stackoverflow.com/questions/2231993/ stackoverflow.com/questions/16145064/ stackoverflow.com/questions/5721883/ stackoverflow.com/questi ons/6044112/ и т. д. и т. д.   -  person thelatemail    schedule 23.04.2019


Ответы (2)


library(fuzzyjoin); library(tidyverse)
dataset1 %>%
  stringdist_left_join(dataset2, 
                       max_dist = 3) %>%
  rename(col_1 = "states.x") %>%
  group_by(col_1) %>%
  mutate(col = paste0("col_", row_number() + 1)) %>%
  spread(col, states.y)

#Joining by: "states"
## A tibble: 4 x 4
## Groups:   col_1 [4]
#  col_1      col_2       col_3        col_4
#  <chr>      <chr>       <chr>        <chr>
#1 California Californiia callifoornia NA   
#2 Florida    Fl0 rida    folrida      NA   
#3 New York   New york    new york     NA   
#4 Texas      T3xas       Te xas       texas

данные:

dataset1 <- data.frame(states = c("California",
                                "Texas",
                                "Florida",
                                "New York"), 
                       stringsAsFactors = F)

dataset2 <- data.frame(stringsAsFactors = F,
  states = c(
    "Californiia",
    "callifoornia",
    "T3xas",
    "Te xas",
    "texas",
    "Fl0 rida",
    "folrida",
    "New york",
    "new york"
  )
)
person Jon Spring    schedule 23.04.2019

Я немного прочитал о stringdist и придумал это. Это обходной путь, но мне он нравится. Определенно можно улучшить:

library(stringdist)
library(janitor)

ds1a <- read.csv('dataset1')
ds2a <- read.csv('dataset2')

distancematrix <- stringdistmatrix(ds2a$name, ds1a$name, useNames = T)


df <- data.frame(stringdistmatrix(ds2a$name, ds1a$name, useNames = T), ncol=maxcol in distance matrix)
# go thru this df, and every cell that's < 4, replace with the column name, otherwise replace with empty string

for (j in 1:ncol(df)) {
      trigger <- df[j,] < 4
      df[trigger , j] <- names(df)[j]
      df[!trigger , j] <- ""
}


df <- remove_constant(df)

write.csv(df, file="~/Desktop/df.csv")
person Tim    schedule 24.04.2019