У меня есть данные примерно в следующем формате, но они очень большие, но разбиты на группы с использованием класса и переменной uniqueId. Где каждое местоположение представляет собой пару строк (x, y).
df <-
data.frame(
x = c(1, 2, 3, 4, 5, 6, 8, 9, 10),
y = c(1, 2, 3, 4, 5, 6, 8, 9, 10),
class = c(0, 0, 0, 0, 0, 1, 0, 1, 0),
uniqueId = c("1-2-3", "1-2-3", "1-2-3", "1-2-4", "1-2-4", "1-2-4", "1-3-2", "1-3-2", "1-3-2"),
partialId = c("1.2", "1.2", "1.2", "1.2", "1.2", "1.2", "1.3", "1.3", 1.3")
)
Используемая мной функция должна проходить через фрейм данных и вычислять наименьшее расстояние до другого объекта в пределах того же уникального идентификатора, но другого класса, что и текущая строка. Для этого я разбил свои данные на куски следующим образом.
indexes <-
df %>%
select(partialId) %>%
unique()
j <- 1
library(doParallel)
class_separation <- c()
cl <- makePSOCKcluster(24)
registerDoParallel(cl)
while(j <= nrow(indexes)) {
test <- df %>% filter(partialId == indexes$partialId[j])
n <- nrow(test)
vec <- numeric(n)
vec <- foreach(k = 1:n, .combine = 'c', .multicombine = F) %dopar% {
c(
min(
apply(
test[test$uniqueId == test$uniqueId[k] & test$class != test$class[k], c("x","y")],
1,
function(x) dist(rbind(c(test$x[k],test$y[k]), c(x[1], x[2])))
)
)
)
}
class_separation <- c(class_separation, vec)
j <- j + 1
}
endtime <- Sys.time()
stopwatch <- endtime - starttime
closeAllConnections()
registerDoSEQ()
gc()
df <- cbind(df, class_separation)
При обработке одиночных воспроизведений или небольших партий этот код работает нормально. Однако при обработке полного набора данных я получаю результаты, которые явно неверны. Я знаю, что должен быть недостаток в том, как я вычисляю эти расстояния, поскольку очень мало шансов, что виновата сама функция dist() или %dopar%. Я изменил на %do% и мои результаты не изменились.
В качестве примера несоответствия на следующем изображении показан столбец class_separation при выполнении полного прогона данных и при подаче небольшого примера. Как видите, результаты сильно отличаются, но я не уверен, почему.