У меня есть данные, которые примерно в следующем формате, но очень большие, но разбиты по группам, используя переменную class и 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")
)
Используемая мной функция должна go пройти через фрейм данных и вычислить наименьшее расстояние до другого объекта в пределах того же уникального идентификатора, но другого класса, что и текущая строка. Для этого я разбил свои данные на куски следующим образом:
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 с момента, когда выполняется полный цикл данных, и когда я передаю его небольшой пример. Как видите, результаты сильно отличаются, но я не уверен, почему.