2014-11-07 3 views
0

커뮤니티 I 좌표 (x, y, z) 및 24 X 10^6 행과 3 열을 포함하는 대용량 데이터 세트를R - 매우 큰 데이터 세트에

을 유클리드 거리 계산을 빠르게하는 방법. 모든 행과 0, 0, 0 인 첫 번째 행 사이의 유클리드 거리를 계산해야합니다. 아래의 루프를 사용하면 매우 오랜 시간이 걸립니다! 또한 데이터 프레임 대신 매트릭스에서도이 작업을 시도했지만 문제가 해결되지 않았습니다.

누구나이 프로세스를 빠르게 할 수있는 제안이 있습니까?

library(cluster) 

e <- list() # list to be filled with euclidean distances 

for (r in 1:(nrow(pca.123.df))) { 

    eucl.dist <- daisy(pca.123.df[c(1,r), ], metric = "euclidean") # Euclidean distance between anomaly and zero (row 1) 

    e[[r]] <- eucl.dist[1] 

} 

답변

4

Euclidean distance의 수식을 사용하십시오.

코드의 재현 예 :

library(cluster) 
set.seed(42) 
DF <- as.data.frame(rbind(0, matrix(rnorm(15), ncol=3))) 

e <- list() # list to be filled with euclidean distances 

for (r in 1:(nrow(DF))) { 

    eucl.dist <- daisy(DF[c(1,r), ], metric = "euclidean") # Euclidean distance between anomaly and zero (row 1) 

    e[[r]] <- eucl.dist[1] 

} 
# [[1]] 
# [1] 0 
# 
# [[2]] 
# [1] 1.895646 
# 
# [[3]] 
# [1] 2.79863 
# 
# [[4]] 
# [1] 1.438665 
# 
# [[5]] 
# [1] 2.133606 
# 
# [[6]] 
# [1] 0.4302796 

벡터화 솔루션 :

sqrt(colSums((t(DF)-unlist(DF[1,]))^2)) 
#[1] 0.0000000 1.8956461 2.7986300 1.4386649 2.1336055 0.4302796 

첫 번째 행 모두 0이라는 지식을 사용 :

sqrt(rowSums(DF^2)) 
#1] 0.0000000 1.8956461 2.7986300 1.4386649 2.1336055 0.4302796 
+0

감사합니다, 효율적인 솔루션 ! –

관련 문제