30.000個の観測値を持つデータフレームの行間のユークリッド距離を計算したい。これを行う簡単な方法は、dist関数(dist(data)など)です。しかし、私のデータフレームが大きいので、これには時間がかかります。ユークリッド距離をより速く計算する
一部の行に欠損値が含まれています。両方の行に欠損値が含まれている行と、行の間に欠落値が含まれていない行間の距離は必要ありません。
for-loopでは、私が必要としない組み合わせを除外しようとしました。残念ながら、私の解決策はさらに時間がかかる:
# 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 forループよりも高速です。 Rcppにループを実装する必要があります。 – Roland
ヒントありがとう!私はこれがどのように機能するかを理解しようとします。 – JSP