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