Я хочу рассчитать эвклидовы расстояния между строками кадра данных с 30 000 наблюдений. Простым способом сделать это является функция dist (например, dist (data)). Однако, поскольку мой блок данных большой, это занимает слишком много времени.Вычислить эвклидовое расстояние более быстрым способом
Некоторые из строк содержат отсутствующие значения. Мне не нужны расстояния между строками, где обе строки содержат отсутствующие значения или между строками, где ни одна из строк не содержит отсутствующих значений.
В течение цикла я попытался исключить комбинации, которые мне не нужны. К сожалению, мое решение занимает еще больше времени:
# Some example data
data <- data.frame(
x1 = c(1, 22, NA, NA, 15, 7, 10, 8, NA, 5),
x2 = c(11, 2, 7, 15, 1, 17, 11, 18, 5, 5),
x3 = c(21, 5, 6, NA, 10, 22, 12, 2, 12, 3),
x4 = c(13, NA, NA, 20, 12, 5, 1, 8, 7, 14)
)
# Measure speed of dist() function
start_time_dist <- Sys.time()
# Calculate euclidean distance with dist() function for complete dataset
dist_results <- dist(data)
end_time_dist <- Sys.time()
time_taken_dist <- end_time_dist - start_time_dist
# Measure speed of my own loop
start_time_own <- Sys.time()
# Calculate euclidean distance with my own loop only for specific cases
# # #
# The following code should be faster!
# # #
data_cc <- data[complete.cases(data), ]
data_miss <- data[complete.cases(data) == FALSE, ]
distance_list <- list()
for(i in 1:nrow(data_miss)) {
distances <- numeric()
for(j in 1:nrow(data_cc)) {
distances <- c(distances, dist(rbind(data_miss[i, ], data_cc[j, ]), method = "euclidean"))
}
distance_list[[i]] <- distances
}
end_time_own <- Sys.time()
time_taken_own <- end_time_own - start_time_own
# Compare speed of both calculations
time_taken_dist # 0.002001047 secs
time_taken_own # 0.01562881 secs
Есть ли более быстрый способ, как я могу вычислить евклидовы расстояния, что мне нужно? Большое спасибо!
dist реализован в C, конечно, он быстрее, чем цикл R. Вы должны реализовать свой цикл в Rcpp. – Roland
Спасибо за подсказку! Я попытаюсь выяснить, как это работает. – JSP