用R计算欧氏距离的更好方法

时间:2015-09-25 19:31:43

标签: r

我正在尝试计算Iris数据集的欧氏距离。基本上我想计算每对物体之间的距离。我的代码如下:

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有内置函数来计算欧几里德函数。在不使用内置函数的情况下,我想知道更好的代码(更快和更少的行),它们可以和我的代码一样。

2 个答案:

答案 0 :(得分:3)

循环内的部分可以写成

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

我会保留嵌套循环,这里没有错。

答案 1 :(得分: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