Цикл Foreach - объект не найден - PullRequest
0 голосов
/ 29 июня 2018

Извинения за долгую задержку. Некоторые вещи возникли, и у них не было возможности вернуться к этому и обновить пост с более ясными и легкими для понимания деталями / данными / кодом.

Вот некоторые данные.

data <- data.table(ZIP1 = c('99999', '99999', '99999', '99999', '99999'),
                      City1 = c('LOS ANGELAS', 'OAKLAND', 'SAN DIEGO', 'LOS ANGELOS', 'LOST ANGELOST'),
                      Name1 = c("JOHN", 'JOhn', 'JoN', 'JOHN', 'JOHNSON'))

data2 <- data.table(ZIP2 = c('99999', '12345', '99999', '99999', '99999'),
                   City2 = c('LOS ANGELAS', 'OAKLAND', 'SAN DIEGO', 'LOS ANGELOS', 'LOST ANGELOST'),
                   Name2 = c("JOHN", 'JOhn', 'JoN', 'JOHN', 'JOHNSON'))

zips<- data.table(zip = c('12345','45678','19899','99999','02345','98129','09101','10001','09839'))

Код, как это работает сегодня:

library('stringr')
library('stringdist')
library('readr')
library('data.table')

func1 <- function(df) {
  df2[] <- lapply(df2, as.character)
  df2$MatchName <- 1-stringdist(data$Name1, data2$Name2, method="jw", p=0.1)
  df2$MatchCity <- 1-stringdist(data$City1, data2$City2, method="jw", p=0.1)
  ##df1$glm <- predict(fit.glm, df1)  Overlay a model to predict if it's a match
  ##df1matches <- df1[glm == '1'] And then we write it somewhere else, SqlServer, disk, etc.
  #rm(df1) then we remove it as we loop through the next zip of matches
}                      

setkey(data, ZIP1)
setkey(data2, ZIP2)
setkey(zips, zip)

for(row in zips$zip) {
  #print(row)
  df1 <- data[ZIP1 %in% row] 
  df2 <- df1[data2, nomatch=0, allow.cartesian=TRUE]
  if (nrow(df1) == 0) {
    next
  }
  df2[,func1(.SD)]
}

, который возвращает следующий фрейм данных

 ZIP1         City1   Name1       City2 Name2 MatchName MatchCity
1: 99999   LOS ANGELAS    JOHN LOS ANGELAS  JOHN 0.7333333 0.5200216
2: 99999       OAKLAND    JOhn LOS ANGELAS  JOHN 0.7333333 0.5200216
3: 99999     SAN DIEGO     JoN LOS ANGELAS  JOHN 1.0000000 1.0000000
4: 99999   LOS ANGELOS    JOHN LOS ANGELAS  JOHN 1.0000000 1.0000000
5: 99999 LOST ANGELOST JOHNSON LOS ANGELAS  JOHN 1.0000000 1.0000000
6: 99999   LOS ANGELAS    JOHN   SAN DIEGO   JoN 0.7333333 0.5200216

По сути, я пытаюсь запустить цикл параллельно, чтобы ускорить его. В зависимости от размера «данных» этот процесс может занять до 5 часов. Из-за ограничений размера и памяти мы используем цикл для сегментирования наборов данных на более мелкие управляемые части. Просто повторюсь, процесс, который мы имеем сегодня, действительно работает и работает хорошо. Надежда состоит в том, чтобы потенциально ускорить его с помощью foreach и использовать параллельный бэкэнд. В идеале возвращаемый результат - это фрейм данных / данных, поскольку мы вставляем каждую строку в базу данных (можно также записать на диск и затем вставить).

    results = foreach(zips=iter(zips, by='row'), .combine=rbind) %dopar%  {
  df1 <- data[data$ZIP1 %in% row]
  df2 <- df1[data2, nomatch=0, allow.cartesian=TRUE]
  if (nrow(df1) == 0) {
  next
  }
df2[,func1(.SD)]
}

Однако моя попытка выдает ошибку «выбраны неопределенные столбцы».

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