1

我的问题(今天)如下:

我在文本格式的文件(“dist.dis”)中有一个上对角线距离矩阵(由第三方程序生成),我想将其读入 R 以计算聚类分析并生成树状图:

   0.36364   0.36364   0.27273   0.81818   0.54545   0.63636   0.36364   0.45455
   0.18182   0.63636   0.63636   0.36364   0.63636   0.54545   0.09091
   0.45455   0.63636   0.18182   0.63636   0.54545   0.27273
   0.81818   0.63636   0.81818   0.27273   0.72727
   0.45455   0.18182   0.63636   0.54545
   0.45455   0.54545   0.27273
   0.81818   0.54545
   0.45455

在一个单独的文本文件(“dist.nam”)中,我还有一个对象名称列表,其中计算了距离:

COOKO-A
COOKO-B
COOKO-C
COOKO-D
COOKO-E
COOKO-F
COOKO-G
COOKO-H
COOKO-I

这是我的 R 代码,用于读取上述矩阵并生成树状图:

mat <- matrix(0, 9, 9)
mat[row(mat) >= col(mat)] <- scan("dist.dis")
hc <- hclust(as.dist(mat), method="average")
ppi <- 100
png("clus.png", width=6*ppi, height=6*ppi, res=ppi)
plot(as.dendrogram(hc), xlab="Distance", ylab="", main="UPGMA dendrogram", horiz=TRUE, edgePar=list(col="blue", lwd=3))
dev.off()

此代码有效,并生成以下树状图:

在此处输入图像描述

但是,我想在树状图的尖端显示对象的名称(而不是它们的编号)。为此,我尝试了以下代码:

names <- scan("dist.nam", what="character")
df.dist <- as.dist(mat)
df.dist <- as.matrix(df.dist, labels=TRUE)
colnames(df.dist) <- names
rownames(df.dist) <- names
hc <- hclust(as.dist(mat), method="average")

但后来我得到了一个可怕的错误:“if (is.na(n) || n > 65536L) stop("size cannot be NA or超过 65536") 中的错误:需要 TRUE/FALSE 的缺失值”。

有人可以帮帮我吗?

4

1 回答 1

2

我怀疑这与使用hclust矩阵而不是dist对象有关。

我会更改矩阵的名称,mat然后使用as.dist(请注意,您实际上只需要设置colnames行和列)。让我知道这是否适合您。

mat <- matrix(0, 9, 9)
mat[row(mat) >= col(mat)] <- scan("dist.dis")

names <- scan("dist.nam", what="character")

colnames(mat) <- names

df.dist <- as.dist(mat)

hc <- hclust(df.dist, method="average")
ppi <- 100
png("clus.png", width=6*ppi, height=6*ppi, res=ppi)
par(mar=c(4,4,4,4))
plot(as.dendrogram(hc), xlab="Distance", ylab="", main="UPGMA dendrogram", horiz=TRUE, edgePar=list(col="blue", lwd=3))
dev.off()

带标签的树状图

于 2019-10-21T00:19:56.340 回答