Нечеткое и нечеткое соответствие data.table со строками символов - PullRequest
0 голосов
/ 30 апреля 2020

Так что мой вопрос практически такой же, как вопрос Люнгбакра , в котором у меня есть два очень больших набора данных, и мне нужно объединить их с помощью точных совпадений в одних столбцах и нечетких совпадений в других. Я хочу, чтобы совпадения были точными в столбце даты рождения DOB и гендерном столбце gender, но я хочу, чтобы они были "похожими" в столбце names.

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

  • расстояние OSA <= 2 & расстояние JW <= 0,2 & .. . </li>

Однако, если это невозможно, просто требование расстояния OSA <= 2 будет большим шагом в правильном направлении. </p>

, когда я попытался запустить ответ из Лингбакра * Я по своим собственным данным получаю ошибку:

Error in bmerge(i, x, leftcols, rightcols, roll, rollends, nomatch, mult,  : 
  roll='nearest' can't be applied to a character column, yet.

Вот как я пытался реализовать Лингбакра ответ:

# copy left data
df <- base

# rename columns
names(df)[c(1, 3)] <- c("ID", "loc")

# copy right data
df_alt <- name_unique

# rename columns
names(df_alt)[c(1, 3)] <- c("ID", "loc")


# implement Lyngbakr's answer with stringdist() instead of abs()
df_alt[df
       , on = .(ID, loc)
       , roll = "nearest"
       , .(ID, loc.x = i.loc, loc.y = x.loc, value, delta = stringdist(i.loc, x.loc))]

Итак, в здесь я просто пытаюсь выполнить левое соединение, используя точное совпадение для DOB и нечеткое совпадение для names, которое я переименовал как ID и loc для обоих наборов данных соответственно.


Данные

Вот небольшой пример моих данных:

library(data.table)
library(tidyverse)

base <- data.table(DOB = c("1956-01-01", "1994-05-13", "2001-07-03",
                           "1998-04-02", "1991-05-28", "2001-09-15",
                           "1999-04-05", "2001-04-10", "1996-01-14",
                           "2000-01-19") %>% as.Date,
                   gender = c("F", "F", "M", "F", "M", "F", "M", "F",
                              "F", "F"),
                   names = c("Regina_Douglas", "Tamar_Hurley", "John_Moreno",
                             "Josephine_Bone_O' Brian", "Borys_Holland",
                             "Tonisha_Moran", "Jarrad_Kaur", "Abbi_Kane",
                             "Leslie_Davis", "Blossom_Povey"),
                   row = 1:10)


name_unique <-
        data.table(s_DOB = c("1941-01-09", "1976-09-22", "1996-08-07",
                             "1993-09-24", "1991-05-28", "2001-09-15",
                             "1969-03-21", "1939-06-25", "1996-01-14",
                             "1978-07-27") %>% as.Date,
                   s_gen = c("M", "M", "F", "M", "M", "F", "M", "F", "F",
                             "F"),
                   s_name = c("Brandon_Hampton", "John_Moreno", "Sally_Kemper",
                              "Nickolas_Bolden", "Boris_Holland", "Tonisha_Morann",
                              "Bryant_Lopez", "Kathryn_Krebs", "Lesli_David",
                              "Kelley__Owens"),
                   s_identif = c(178, 184, 136, 188, 198, 133, 197,
                                 143, 200, 132))

Требуемый вывод выглядит следующим образом:

DOB         gender  names                   row s_identif
1956-01-01  F       Regina_Douglas          1   NA
1994-05-13  F       Tamar_Hurley            2   NA
2001-07-03  M       John_Moreno             3   NA
1998-04-02  F       Josephine_Bone_O' Brian 4   NA
1991-05-28  M       Borys_Holland           5   198
2001-09-15  F       Tonisha_Moran           6   133
1999-04-05  M       Jarrad_Kaur             7   NA
2001-04-10  F       Abbi_Kane               8   NA
1996-01-14  F       Leslie_Davis            9   200
2000-01-19  F       Blossom_Povey           10  NA

Я также пытался использовать функция chameau13 , но не удалось правильно ее реализовать, и поскольку у функции нет документации, я не знаю, как ее использовать. Как он упоминает в посте, функции fuzzy_join() и fuzzy_left_join() не очень эффективны и требуют более 100 ТБ ОЗУ для работы с полными наборами данных. Следовательно, необходимо другое решение.

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