我正试图使用heatmap2函数从二进制矩阵中创建一个heatmap,并从heatmap中提取树状图,并将树状图保存为newick文件格式。矩阵在行上有基因组,列上有基因。
为此,我正在运行以下代码。
library(ggdendro)
library(ape)
library(gplots)
library(vegan)
profile <-as.data.frame(read.delim("profile_file.txt",row.names=1,sep="t", as.is=T))
dist_func<-function(x) vegdist(x,"jaccard",binary=TRUE)
hclust_func<-function(x) hclust(x,method="ward.D2")
heat<-heatmap.2(as.matrix(profile),Rowv=TRUE,Colv=TRUE,distfun=dist_func,hclustfun=hclust_func,trace="none")
row.dendro<-heat$rowDendrogram
row.hcclust<-as.hclust(row.dendro)
row.phylo<-as.phylo(row.hcclust)
write.tree(phy=row.phylo, file="tree_file.nwk")
当我尝试运行这段代码时,它运行得很好。但是,当我减少基因列的数量时,我在尝试将树状图转换为hclust对象的步骤中遇到了一个错误。
row.hcclust<-as.hclust(row.dendro)
错误:all(vapply(s,is.integer,NA))不是TRUE
我试着在我的数据集中寻找任何"NA"值,但没有,否则它也不应该适用于整个数据集。
有人能帮我解决这个错误吗?或者建议出现此错误的原因是什么?
heatmap.2使用hclust构建树状图。如果你只想要树状图,就没有理由使用它。如果原因是你想要树状图的排序,只需使用dendrend包中的sort即可获得你想要的订单。否则,就留在hclust。方法如下:
library(ape); library(vegan);
library(magrittr) # for the pipes: %>%
profile <- as.data.frame(read.delim("profile_file.txt",row.names=1,sep="t", as.is=T))
row_hclust <- profile %>% as.matrix %>% t %>% vegdist("jaccard",binary=TRUE) %>% hclust(method="ward.D2")
row.phylo <- as.phylo(row_hclust)
write.tree(phy=row.phylo, file="tree_file.nwk")