这是我第一次与R.合作。
我有一个有3列和12090行(156个细菌)的表。前两列是细菌的名称,最后一列是表示生物之间相关性的数字(基于一种基因组相似性)。例子是(编号):
bacteria1 bacteria2 0.25846
bacteria1 bacteria3 0.35986
bacteria2 bacteria1 0.57896
bacteria2 bacteria3 0.54596
bacteria3 bacteria1 0.23659
bacteria3 bacteria2 0.36528
我希望能够将邻居加入到各种各样的系统发育树中。我看到了' nj'需要一个距离矩阵才能做到这一点。如何将其转换为距离矩阵或可用格式? (数字已经是距离所以不应该做任何数学运算) 我尝试过as.dist()和as.matrix()和reshape(),但是新的我可能做错了什么。 (重塑可能是我需要的......)
或者,如果有人知道如何通过其他方式将这些变成一棵树。
感谢您的帮助。
答案 0 :(得分:2)
使用库reshape2
(与基础R中的重塑功能不同,我认为很多
# Load the library (after installing it, of course)
library(reshape2)
# Load up your data - for future reference, it's always helpful to post your data
# with a question. I used dput(x) to generate this structure below:
x <- structure(list(V1 = structure(c(1L, 1L, 2L, 2L, 3L, 3L),
.Label = c("bacteria1", "bacteria2", "bacteria3"),
class = "factor"), V2 = structure(c(2L, 3L, 1L, 3L, 1L, 2L),
.Label = c("bacteria1", "bacteria2", "bacteria3"), class = "factor"),
V3 = c(0.25846, 0.35986, 0.57896, 0.54596, 0.23659, 0.36528)),
.Names = c("V1", "V2", "V3"), class = "data.frame",
row.names = c(NA, -6L))
# Recast it - acast returns a matrix with V1 as the records, V2 as the columns,
# and V3 as the values
distmat <- acast(x, V1 ~ V2, value.var = "V3")
答案 1 :(得分:2)
听起来你有距离矩阵的上三角或下三角部分,但没有尺寸。 (虽然你确定你有156行吗?如果有18种细菌,那么应该有choose(18,2)
= 153个条目,而不是156个。)
假设你的表中确实有153行,你可以这样填写矩阵:
m <- matrix(nrow=18, ncol=18)
m[row(m) < col(m)] <- x # if it's the upper triangular portion
或
m[row(m) > col(m)] <- x # if it's the lower triangular portion
然后diag(m) <- 0
为对角线。