I have got a text file containing 200 models all compared to eachother and a molecular distance for each 2 models compared. It looks like this:
1 2 1.2323
1 3 6.4862
1 4 4.4789
1 5 3.6476
.
.
All the way down to 200, where the first number is the first model, the second number is the second model, and the third number the corresponding molecular distance when these two models are compared.
I can think of a way to import this into R and create a nice 200x200 matrix to perform some clustering analyses on. I am still new to Stack and R but thanks in advance!
答案 0 :(得分:0)
由于我不知道你的问题是什么格式的文件,我将采用最通用的文件格式,即CSV。
然后,您应该查看阅读文件read.csv
或fread
。
示例代码:
dt <- read.csv(file, sep = "", header = TRUE)
我建议使用data.table
包。然后:
setDT(dt)
dt[, id := paste0(as.character(col1), "-", as.character(col2))]
这会在第一个和第二个模型中创建一个新变量,并作为唯一ID。
我所做的就是删除此ID并缩放数字输入。 缩放后,运行聚类算法。
将结果与id合并以分析结果。
这就是你要找的东西吗?
答案 1 :(得分: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()
与ncol
和nrow
使用&#34;重塑&#34;你的距离矢量以适当的方式:
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)]