Более эффективный способ нечеткого совпадения в R? - PullRequest
2 голосов
/ 16 мая 2019

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

Используется пакет stringdist.Из того, что я понимаю, stringdist работает путем сравнения одной строки со всеми другими строками во фрейме данных.Таким образом, для фрейма данных с 5 строками потребуется 20 вычислений:

, т.е.строка 1 по сравнению со строкой 2строка 1 по сравнению с строкой 3строка 1 по сравнению с строкой 4строка 1 по сравнению с строкой 5строка 2 по сравнению со строкой 1строка 2 по сравнению с строкой 3строка 2 по сравнению с строкой 4строка 2 по сравнению с строкой 5строка 3 по сравнению со строкой 1строка 3 по сравнению со строкой 2строка 3 по сравнению с строкой 4строка 3 по сравнению с строкой 5строка 4 по сравнению с строкой 1строка 4 по сравнению со строкой 2строка 4 по сравнению с строкой 3строка 4 по сравнению с строкой 5строка 5 по сравнению с строкой 1строка 5 по сравнению со строкой 2строка 5 по сравнению с строкой 3строка 5 по сравнению с строкой 4

Увеличение размера фрейма данных экспоненциально увеличит время, необходимое для завершения функции.С моим довольно большим фреймом данных, очевидно, это занимает некоторое время

Мое предлагаемое решение заключается в следующем: после сравнения каждой строки со всеми другими строками во фрейме данных, есть ли способ пропустить эти строки в будущих вычислениях?Например, в приведенном выше примере строка 1 по сравнению со строкой 2 будет такой же, как строка 2 по сравнению со строкой 1. Можем ли мы удалить один из этих вычислений?

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

строка 1 по сравнению со строкой 2строка 1 по сравнению с строкой 3строка 1 по сравнению с строкой 4строка 1 по сравнению с строкой 5строка 2 по сравнению с строкой 3строка 2 по сравнению с строкой 4строка 2 по сравнению с строкой 5строка 3 по сравнению с строкой 4строка 3 по сравнению с строкой 5строка 4 по сравнению с строкой 5

Это раздел функции в коде, который ищет эти дубликаты в различных столбцах - есть идеи, как я могу это исправить?

lastName <- stringdist(DataND$SURNAME[rownumber],DataND$SURNAME, method='lv')
firstName <- stringdist(DataND$GIVEN.NAME[rownumber],DataND$GIVEN.NAME, method='lv')
birthDate <- stringdist(DataND$DOB[rownumber],DataND$DOB, method='lv')
streetAddress<-stringdist(DataND$ADDR.1[rownumber],DataND$ADDR.1, method='lv')
suburb <- stringdist(DataND$LOCALITY[rownumber],DataND$LOCALITY, method='lv')

Ответы [ 2 ]

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

Идея H 1 великолепна.Другим вариантом может быть fuzzyjoin -пакет.

library(fuzzyjoin)
library(dplyr)

df <- tibble(id = seq(1,10),
             words = replicate(10, paste(sample(LETTERS, 5), collapse = "")))



stringdist_left_join(df, df, by = c(words = "words"), max_dist = 5, method = "lv", distance_col = "distance") %>%
  filter(distance != 0)

# A tibble: 90 x 5
    id.x words.x  id.y words.y distance
   <int> <chr>   <int> <chr>      <dbl>
 1     1 JUQYR       2 HQMFD          5
 2     1 JUQYR       3 WHQOM          4
 3     1 JUQYR       4 OUWJV          4
 4     1 JUQYR       5 JURGD          3
 5     1 JUQYR       6 ZMLAQ          5
 6     1 JUQYR       7 RWLVU          5
 7     1 JUQYR       8 AYNLE          5
 8     1 JUQYR       9 AUPVJ          4
 9     1 JUQYR      10 JDFEY          4
10     2 HQMFD       1 JUQYR          5
# ... with 80 more rows

Здесь у вас все настроено в конце, вы можете выбирать и отклонять ряды по расстоянию.На 100.000 записей ушло 11 секунд.Попытка с stringdistmatrix() однако я получил ошибку:

Ошибка: невозможно выделить вектор размером 37,3 Гб

0 голосов
/ 16 мая 2019

lastName<-stringdist(DataND$SURNAME[rownumber], DataND$SURNAME, method='lv')

Если я понимаю эту строку, она сравнивает одну фамилию (согласно значению rownumber) с фамилиями аллергиков. Поэтому, когда вы изменяете rownumber, все сравнения выполняются, даже те, которые уже были сделаны ранее.

Чтобы предотвратить это, попробуйте:

lastName<-stringdist(DataND$SURNAME[rownumber], DataND$SURNAME[rownumber:nrows], method='lv') где nrows - количество строк

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