从x,y,z坐标

时间:2016-09-24 01:16:54

标签: r dimension euclidean-distance

我有来自主成分分析的x,y和z坐标,我想计算欧氏距离矩阵。

测试数据:

                  X           Y             Z
samp_A -0.003467119 -0.01422762 -0.0101960126
samp_B -0.007279433  0.01651597  0.0045558849
samp_C -0.005392258  0.02149997  0.0177409387
samp_D -0.017898802  0.02790659  0.0006487222
samp_E -0.013564214  0.01835688  0.0008102952
samp_F -0.013375397  0.02210725 -0.0286032185

我最终希望以下列格式返回一个表:

    A    B     ...
A   0    0.2   ...
B   0.2  0     ...
... ...  ...   ...
... ...  ...   ...

显然上面的距离数据是假的。 X,Y和Z数据只是完整数据集的头部。完整数据集包含大约4000个entires。我认为这需要做的是一种有效的方式。如果它更容易,那么计算最近的距离,比如10点,就足够了(剩下的点数将是NA或0)。

任何帮助将不胜感激!

编辑:有人建议使用dist,但我不认为这允许三个坐标。如果我使用dist,结果似乎是无稽之谈(?)。

> pca_coords_dist <- dist(pca_coords)
> head(pca_coords_dist)
[1] 0.03431210 0.04539427 0.04583855 0.03584466 0.04191922 0.04291657

我相信一种方法是创建一个计算距离的函数,并以成对的方式将其应用于每一行。我认为这是计算三维距离的正确函数。

euc.dist.3 <- function(x1, x2, y1, y2, z1, z2 ) sqrt( (x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2 )

如果我将此应用于sampA和sampB,则结果为1.56643。

现在,有没有办法将此功能应用于每个成对行?并将输出格式化为距离矩阵?

2 个答案:

答案 0 :(得分:5)

在R:

中尝试trusted_certs/
? dist

在上面的代码中, yourData data.frame 矩阵

答案 1 :(得分:3)

编辑: dist(),正如Xiaotao Luo和Richard Telford所说的3D坐标。实际上,这个答案给出了与dist()相同的结果。所以使用dist() !!

您可以执行与this回答类似的操作:

首先创建一个包含所有成对行组合的索引矩阵:

使用:

x = matrix(runif(15),nrow = 5)

          [,1]       [,2]       [,3]
[1,] 0.1307924 0.94255848 0.55138616
[2,] 0.7027617 0.11180608 0.73997077
[3,] 0.5573857 0.64836253 0.11229408
[4,] 0.4391854 0.04849022 0.93454137
[5,] 0.5292623 0.19308569 0.00826927

ind = t(combn(nrow(x), 2))

> ind
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    3
 [6,]    2    4
 [7,]    2    5
 [8,]    3    4
 [9,]    3    5
[10,]    4    5

然后使用apply:

继续计算所有这些组合的3D距离
distances = apply(ind, 1, function(z){
    sqrt(sum((x[z[1],] - x[z[2], ])^2))
})

给出:

> cbind(data.frame(ind), distances)
   X1 X2 distances
1   1  2 1.0260910
2   1  3 0.6792164
3   1  4 1.0204275
4   1  5 1.0077022
5   2  3 0.8384540
6   2  4 0.3336751
7   2  5 0.7563700
8   3  4 1.0246505
9   3  5 0.4678558
10  4  5 0.9418077

简而言之:

ind = t(combn(nrow(x), 2))
distances = apply(ind, 1, function(z){
    sqrt(sum((x[z[1],] - x[z[2], ])^2))
})
result = cbind(data.frame(ind), distances)

其中x是具有3D坐标的矩阵