foreach и doparallel работали без проблем в R, но не получили правильного результата - PullRequest
1 голос
/ 08 мая 2019

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

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

#create main data frame
df <- data.frame("Index" = 1:7, "Text" = c("Brad came to dinner with us tonigh.",
                                            "Wuld you like to trave with me?",
                                            "There is so muh to undestand.",
                                            "Sentences cone in many shaes and sizes.",
                                            "Learnin R is fun",
                                            "yesterday was Friday",
                                            "bing search engine"), stringsAsFactors = FALSE)

#create predefined misspelled data frame
df_r <- data.frame("misspelled" = c("tonigh", "Wuld", "trave", "muh", "undestand", "shaes", "Learnin"), 
                   "correction" = c("tonight", "Would", "travel", "much", "understand", "shapes", "Learning"))

library(DataCombine)
library(doParallel)
library(foreach)
no_cores <- detectCores()
cl <- makeCluster(no_cores[1]-1)
registerDoParallel(cl)

df_replacement <- foreach((df$Text), .combine = cbind) %dopar% {
  replacement = DataCombine::FindReplace(data = df, Var = "Text", replaceData = df_r,
                                             from = "misspelled", to = "correction", exact = FALSE)

  replacement
}
stopCluster(cl)

Я не уверен, что я сделал неправильно в части foreach. Любой совет приветствуется.

1 Ответ

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

Я думаю, что вы ищете это:

df_replacement <- foreach(i = (rownames(df)), .combine = rbind) %dopar% {
  replacement = DataCombine::FindReplace(data = df[i,], Var = "Text", replaceData = df_r,
                                         from = "misspelled", to = "correction", exact = FALSE)

  replacement
}

что происходит:

Foreach понимает, что он должен работать в строках. Но ваша функция всегда вызывает целое! dataframe. Таким образом, выходные данные также представляют собой весь фрейм данных, длина которого составляет два столбца для каждого цикла. .combine=cbind объединяет кадры данных по столбцам .... 2 (столбцы) * 7 (ядра) = 14. Поэтому убедитесь, что ваш FindReplace просто вызывает строки, которые вы хотите иметь, а не весь кадр данных в каждом цикле.

Я редактировал это, вызывая только строки каждой итерации df[i,] в вашем FindReplace. Также я изменил cbind на rbind, так как вы хотите добавить строки, а не столбцы впоследствии.

...