2017-06-14 96 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合并来分析结果。

这是你在找什么?