(Нет тега для r-параллельной обработки или пакета foreach для R, если бы он был, я бы отметил их здесь. Приветствуются предложения тегов).
У меня есть фрейм данных "training_data" и вектор "cats" (для категориальных данных).
кошка выглядит как c("fruits", "vegetables", "meats")
Я хочу перебрать каждую из кошек в данных тренировки и заменить любые низкочастотные уровни просто «Другие».
Это работает:
library(foreach)
foreach(c = cats) %do% { # not parallel processing
print(c)
freqs <- table(training_data[c])
low_freqs <- names(which(freqs < 20000))
training_data[c][[1]] <- ifelse(training_data[c][[1]] %in% low_freqs, "Other", training_data[c][[1]])
return(NULL) # otherwise spits out the whole thing
}
На каждой итерации в первой строке print (c) выводится значение оперируемого вектора cat, и я вижу его в консоли:
"фрукты"
"овощи"
"мясо"
После этих кошек на терминал выводятся 3 экземпляра NULL, ожидаемые из-за последней строки в цикле. Когда я проверяю свой фрейм данных training_data, категориальные переменные были преобразованы, как и ожидалось. Любой уровень с частотой менее 20 КБ был заменен другим.
Однако, если я попытаюсь использовать параллель:
library(foreach)
foreach(c = cats) %dopar% { # parallel (I have 8 cores)
print(c)
freqs <- table(training_data[c])
low_freqs <- names(which(freqs < 20000))
training_data[c][[1]] <- ifelse(training_data[c][[1]] %in% low_freqs, "Other", training_data[c][[1]])
#return(NULL) # otherwise spits out the whole thing
}
Все, что происходит, это то, что NULLS печатаются на консоли. Данные обучения не преобразуются, и на консоли не отображается отпечаток (c).
Почему работает только%%, а не% dopar%?