2017-06-14 121 views
-1

我有一個包含200個模型的文本文件,與eachother相比,每個模型的分子距離相比較。它看起來像這樣:如何在R中導入聚類的距離矩陣

1 2 1.2323 
1 3 6.4862 
1 4 4.4789 
1 5 3.6476 
. 
. 

所有下降至200,其中第一號是第一個模型的方式,當這兩個模型相比,第二個數字是第二種模式,第三個數字對應的分子距離。

我可以想出一種方法將它導入到R中,並創建一個很好的200x200矩陣來執行一些聚類分析。我對Stack和R仍然很陌生,但是要提前感謝!

回答

0

既然你沒有model1和自身之間的距離,你需要插入自己使用的答案從this question

(可以忽略模型的錯誤編號相比,你的輸入數據,它不服務於一個目的,真的)

# Create some dummy data that has the same shape as your data: 
    df   <- expand.grid(model1 = 1:120, model2 = 2:120) 
    df$distance <- runif(n = 119*120, min = 1, max = 10) 
    head(df) 
    # model1 model2 distance 
    # 1  2 7.958746 
    # 2  2 1.083700 
    # 3  2 9.211113 
    # 4  2 5.544380 
    # 5  2 5.498215 
    # 6  2 1.520450 

inds <- seq(0, 200*119, by = 200) 
val <- c(df$distance, rep(0, length(inds))) 

inds <- c(seq_along(df$distance), inds + 0.5) 
val <- val[order(inds)] 

一旦這項工作到位,你可以使用matrix()ncolnrow爲「重塑」你的距離矢量在適當的方式:

matrix(val, ncol = 200, nrow = 200) 

編輯:

當你的數據只包含距離爲一個方向,所以只有之間例如model1 - model5而不是model5 - model1,你將不得不填充矩陣的上三角部分的值,就像他們做here。忘記我在這個答案的第一部分中生成的數據。另外,忘記將其添加到距離列中。

dist_mat      <- diag(200) 
dist_mat[upper.tri(dist_mat)] <- your_data$distance 

到上三角項複製到下面的對角線,使用:

dist_mat[lower.tri(dist_mat)] <- t(dist_mat)[lower.tri(dist_mat)] 
+0

我想這和它的作品,但問題是,對於矩陣,兩者(例如)56- 112和112-56應該在矩陣中,即使它們是相同的數字。但所有重複項都不在文件中,所以生成的矩陣似乎不正確:( –

+0

@MatthijsvanKesteren我編輯了我的答案。「編輯」後面的部分現在只適用於您的案例 –

+0

對不起,對於回覆遲是英雄! –

0

由於我不知道你的問題是什麼格式的文件,我將採用最通用的文件格式,即CSV。

然後你應該看看讀取文件read.csvfread

示例代碼:

dt <- read.csv(file, sep = "", header = TRUE) 

我建議使用data.table包。然後:

setDT(dt) 
dt[, id := paste0(as.character(col1), "-", as.character(col2))] 

這會在第一個和第二個模型中創建一個新變量,並作爲唯一的ID。

我所做的是刪除此ID並縮放數字輸入。 縮放後,運行聚類算法。

將結果與id合併來分析結果。

這是你在找什麼?