2015-09-25 97 views
1

我想要計算Iris數據集的歐幾里得距離。基本上我想計算每對物體之間的距離。我有一個代碼工作如下:更好的方法來計算與R的歐氏距離

for (i in 1:iris_column){ 
    for (j in 1:iris_row) { 

    m[i,j] <- sqrt((iris[i,1]-iris[j,1])^2+ 
        (iris[i,2]-iris[j,2])^2+ 
        (iris[i,3]-iris[j,3])^2+ 
        (iris[i,4]-iris[j,4])^2) 
    } 
} 

雖然這個作品,我不認爲這是擰R-代碼風格的好方法。我知道R具有計算歐幾里德函數的內置函數。在不使用內置函數的情況下,我想知道更好的代碼(更快,更少的代碼行),這些代碼可以和我的代碼一樣。

回答

3

循環中的一部分可以寫成

m[i, j] = sqrt(sum((iris[i, ] - iris[j, ])^2)) 

我會保持嵌套循環,沒有錯在這裏。

0

或保持與標準封裝stats

m <- dist(iris[,1:4])) 

這給您緊湊類dist,存儲下三角的對象(你所需要的)。例如,如果你喜歡看一些元素,你可以得到一個普通的全對稱矩陣:

> as.matrix(m)[1:5,1:5] 
      1   2  3   4   5 
1 0.0000000 0.5385165 0.509902 0.6480741 0.1414214 
2 0.5385165 0.0000000 0.300000 0.3316625 0.6082763 
3 0.5099020 0.3000000 0.000000 0.2449490 0.5099020 
4 0.6480741 0.3316625 0.244949 0.0000000 0.6480741 
5 0.1414214 0.6082763 0.509902 0.6480741 0.0000000