Минимизация количества вычислений при нечетком сопоставлении и цикле for - PullRequest
0 голосов
/ 25 сентября 2019

В настоящее время я пытаюсь найти потенциальные дубликаты в большом наборе данных (более 500 000 строк), используя нечеткое сопоставлениеЭтот код состоит из трех основных частей:

  1. Функция, которую я написал, которая идентифицирует наиболее похожий потенциальный дубликат в наборе данных (возвращая оценку - она ​​выбирает самую высокую оценку).

  2. Функция, которая определяет позицию записи, которая с наибольшей вероятностью может быть дубликатом.

  3. A для цикла, который выполняет обаприведенных выше функций для каждой записи и возвращает значения в столбце DupScore и столбце positionBestMatch.

Пример результирующего набора данных приведен ниже:

   Name:     DOB:         DupScore    positionbestMatch
   Ben       6/3/1994     15          3
   Abe       5/5/2005     11          5
   Benjamin  6/3/1994     15          1 
   Gabby     01/01/1900   10          6
   Abraham   5/5/2005     11          2
   Gabriella 01/01/1900   10          4 

Цикл for для вычисления этих оценок выглядит примерно так (scorefunc и position func являются самописными функциями):

for (i in c(1:length(df$Name))) {
  df$dupScore[i]<-scorefunc[i]
  df$positionBestMatch[i]<-positionfunc[i]
}

Очевидно, что для набора данных с таким количеством строк этоцикл занимает много времени и требует больших вычислительных ресурсов, поскольку он проходит по каждой строке.Как я могу отредактировать цикл for таким образом:

  1. Когда для строки вычисляется DupScore, он также вставляет счет не только в строку [i], но и в строкуpositionbestMatch?
  2. И цикл запускается только для тех с пустыми значениями DupScore и positionBestMatch.

Надеюсь, это имеет смысл!

1 Ответ

0 голосов
/ 25 сентября 2019

Попробуйте использовать while цикл

all_inds <- seq_len(nrow(df))
i <- all_inds[1]

while (length(all_inds) > 1) {
   i <- all_inds[1]
   df$dupScore[i]<-scorefunc[i]
   df$positionBestMatch[i]<-positionfunc[i]
   df$dupScore[df$positionBestMatch[i]] <- df$dupScore[i] 
   all_inds <- setdiff(all_inds, c(i, df$positionBestMatch[i]))
}

Но это сохранит некоторые пустые значения для df$positionBestMatch.

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