从 x,y,z 坐标计算欧氏距离矩阵
Compute euclidean distance matrix from x,y,z coordinates
我有来自主成分分析的 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
我最终想要return一个table格式如下:
A B ...
A 0 0.2 ...
B 0.2 0 ...
... ... ... ...
... ... ... ...
显然上面的距离数据是假的。 X、Y 和 Z 数据只是完整数据集的头部。完整的数据集由大约 4000 个整体组成。我认为这需要以一种有效的方式完成。如果它更容易,那么计算最近的距离,比如 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。
现在,有没有办法将此函数应用于每一对行?并将输出格式化为距离矩阵?
在 R:
中尝试 ? dist
distance.matrix <- dist(yourData, method = "euclidean", diag = T)
在上面的代码中,yourData 是您的 data.frame 或 matrix
编辑: 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
然后使用应用继续计算所有这些组合的 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 坐标的矩阵
我有来自主成分分析的 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
我最终想要return一个table格式如下:
A B ...
A 0 0.2 ...
B 0.2 0 ...
... ... ... ...
... ... ... ...
显然上面的距离数据是假的。 X、Y 和 Z 数据只是完整数据集的头部。完整的数据集由大约 4000 个整体组成。我认为这需要以一种有效的方式完成。如果它更容易,那么计算最近的距离,比如 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。
现在,有没有办法将此函数应用于每一对行?并将输出格式化为距离矩阵?
在 R:
中尝试? dist
distance.matrix <- dist(yourData, method = "euclidean", diag = T)
在上面的代码中,yourData 是您的 data.frame 或 matrix
编辑: 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
然后使用应用继续计算所有这些组合的 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 坐标的矩阵