2016-09-24 167 views
0

我有一個來自主成分分析的x,y和z座標,我想計算一個歐幾里得距離矩陣。從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個樣本。我認爲這需要做一個有效的方式。如果比較容易,那麼計算最近的距離,比如說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 

我相信去了解這一個方法是創建一個函數來計算距離,並將其應用到每一行成對方式。 I 認爲這是計算三維距離的正確函數。

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

如果我將此應用於sampA和sampB,結果爲1.56643。

現在,有沒有辦法將這個函數應用於每個成對的行?並將輸出格式化爲距離矩陣?

+0

'dist'是你所需要的 –

+0

這是我的理解是'dist'不使用三個座標。我需要以成對的方式對每一行應用一個函數。 – user2117258

+0

如果你爲A和B做'euc.dist.3',它會給出0.0343121。做'euc.dist.3'(-0.003467119,-0.007279433,-0.01422762,0.01651597,-0.0101960126,0.0045558849)' –

回答

4

嘗試? dist在R:

distance.matrix <- dist(yourData, method = "euclidean", diag = T) 

在上面的代碼,yourData是您的data.frame矩陣

+0

它是'data.frame' – user2117258

+0

我不相信'dist'支持三個座標。請參閱上面的修改。 – user2117258

+0

** dist **返回一個距離矩陣,假設** dis.mat **和** dis.mat [i,j] **表示您的** data.frame *之間的一種距離的值。 * _ith_ row和_jth_ row –

2

編輯: 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矩陣座標

相關問題