2015-09-25 60 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