Ich möchte die euklidischen Abstände zwischen Zeilen eines Datenrahmens mit 30.000 Beobachtungen berechnen. Ein einfacher Weg, dies zu tun, ist die Funktion dist (z. B. dist (Daten)). Da mein Datenrahmen jedoch groß ist, benötigt dies zu viel Zeit.Berechnen Sie den euklidischen Abstand schneller
Einige der Zeilen enthalten fehlende Werte. Ich brauche nicht die Abstände zwischen Zeilen, in denen beide Zeilen fehlende Werte enthalten, oder zwischen Zeilen, in denen keine der Zeilen fehlende Werte enthält.
In einer For-Schleife habe ich versucht, die Kombinationen auszuschließen, die ich nicht brauche. Leider nimmt meine Lösung noch mehr Zeit:
# 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
Gibt es einen schnelleren Weg, wie ich die euklidischen Entfernungen berechnen könnte, die ich brauche? Danke vielmals!
dist ist in C implementiert, natürlich ist es schneller als eine R for-Schleife. Sie sollten Ihre Schleife in Rcpp implementieren. – Roland
Danke für den Hinweis! Ich werde versuchen herauszufinden, wie das funktioniert. – JSP