我想从R中导出hclust-dendrogram到数据表中,以便随后将其导入到另一个(“自制”)软件中。 str(unclass(fit))
为树形图提供了一个文本概述,但是我正在寻找的实际上是一个数字表。我查看了Bioconductor ctc软件包,但它生成的输出看起来有些隐晦。我想有类似于这张表的东西:http://stn.spotfire.com/spotfire_client_help/heat/heat_importing_exporting_dendrograms.htm 有没有办法从R中的hclust对象中获取它?导出树状图作为表R
5
A
回答
1
有包,做完全相反的你想要什么 - Labeltodendro ;-)
但严重的是,你就不能手动提取hclust
对象中的元素(如$merge
,$height
,$order
),并创建自定义表中提取的元素?
3
如果任何人也对树状图导出感兴趣,这是我的解决方案。最有可能的是,它不是最好的,因为我最近才开始使用R,但至少它工作正常。因此,如何改进代码的建议值得欢迎。
所以,如果hr
是我hclust对象,df
是我的数据,第一列,其中包含从0开始一个简单的索引和行的名称是集群项目的名称:
# Retrieve the leaf order (row name and its position within the leaves)
leaf.order <- matrix(data=NA, ncol=2, nrow=nrow(df),
dimnames=list(c(), c("row.num", "row.name")))
leaf.order[,2] <- hr$labels[hr$order]
for (i in 1:nrow(leaf.order)) {
leaf.order[which(leaf.order[,2] %in% rownames(df[i,])),1] <- df[i,1]
}
leaf.order <- as.data.frame(leaf.order)
hr.merge <- hr$merge
n <- max(df[,1])
# Re-index all clustered leaves and nodes. First, all leaves are indexed starting from 0.
# Next, all nodes are indexed starting from max. index leave + 1.
for (i in 1:length(hr.merge)) {
if (hr.merge[i]<0) {hr.merge[i] <- abs(hr.merge[i])-1}
else { hr.merge[i] <- (hr.merge[i]+n) }
}
node.id <- c(0:length(hr.merge))
# Generate dendrogram matrix with node index in the first column.
dend <- matrix(data=NA, nrow=length(node.id), ncol=6,
dimnames=list(c(0:(length(node.id)-1)),
c("node.id", "parent.id", "pruning.level",
"height", "leaf.order", "row.name")))
dend[,1] <- c(0:((2*nrow(df))-2)) # Insert a leaf/node index
# Calculate parent ID for each leaf/node:
# 1) For each leaf/node index, find the corresponding row number within the merge-table.
# 2) Add the maximum leaf index to the row number as indexing the nodes starts after indexing all the leaves.
for (i in 1:(nrow(dend)-1)) {
dend[i,2] <- row(hr.merge)[which(hr.merge %in% dend[i,1])]+n
}
# Generate table with indexing of all leaves (1st column) and inserting the corresponding row names into the 3rd column.
hr.order <- matrix(data=NA,
nrow=length(hr$labels), ncol=3,
dimnames=list(c(), c("order.number", "leaf.id", "row.name")))
hr.order[,1] <- c(0:(nrow(hr.order)-1))
hr.order[,3] <- t(hr$labels[hr$order])
hr.order <- data.frame(hr.order)
hr.order[,1] <- as.numeric(hr.order[,1])
# Assign the row name to each leaf.
dend <- as.data.frame(dend)
for (i in 1:nrow(df)) {
dend[which(dend[,1] %in% df[i,1]),6] <- rownames(df[i,])
}
# Assign the position on the dendrogram (from left to right) to each leaf.
for (i in 1:nrow(hr.order)) {
dend[which(dend[,6] %in% hr.order[i,3]),5] <- hr.order[i,1]-1
}
# Insert height for each node.
dend[c((n+2):nrow(dend)),4] <- hr$height
# All leaves get the highest possible pruning level
dend[which(dend[,1] <= n),3] <- nrow(hr.merge)
# The nodes get a decreasing index starting from the pruning level of the
# leaves minus 1 and up to 0
for (i in (n+2):nrow(dend)) {
if ((dend[i,4] != dend[(i-1),4]) || is.na(dend[(i-1),4])){
dend[i,3] <- dend[(i-1),3]-1}
else { dend[i,3] <- dend[(i-1),3] }
}
dend[,3] <- dend[,3]-min(dend[,3])
dend <- dend[order(-node.id),]
# Write results table.
write.table(dend, file="path", sep=";", row.names=F)
相关问题
- 1. 导出列表作为R
- 2. 将R表导出为HTML
- 3. R彩色树状图建议?
- 4. asp.net树视图导出为excel
- 5. 将注册表树导出为XML
- 6. MobX状态树 - 导出模型验证?
- 7. Highcharts - 导出图表的当前状态
- 8. 使用索引(比例数据)作为分组变量创建树状图,R
- 9. R:制作交互式地图,可以导出为HTML
- 10. 为树状
- 11. Scikit树状图:如何禁用输出?
- 12. R中导出表链接
- 13. 与父,子表构建树状图
- 14. 树状图在下拉列表中jquery
- 15. 树状图在vba用户表格
- 16. 导出表作为xls表在Raectjs
- 17. 将所有图表导出为图形
- 18. 将图表导出为python xlwings图像
- 19. Visual Studio:将图表导出为图像?
- 20. 将字典显示为树状图吗?
- 21. 如何从Excel导出图表作为图形
- 22. d3heatmap - 没有树状图的树状图行名和姓氏
- 23. 表设计为树状数据
- 24. 树状聚类高度测定 - R
- 25. 绘制树状结构与图像作为节点在matlab中
- 26. R图表的所有派系的列表:如何导出为Excel?
- 27. ImageJ:导出多个图像的柱状图列表
- 28. 将马赛克情节表示为树状图
- 29. 如何调整树状图(R)中x轴的大小?
- 30. 如何手动创建树状图(或“hclust”)对象? (in R)
我只是使用这个代码,它完美的工作。对我来说很大的困难?阅读关于需要什么输入数据的说明 - 对数据帧“df”的描述实际上很重要。 – eleanorahowe 2013-02-14 15:44:31
@Eleanor我很高兴你发现它很有用。你是对的,代码依赖于输入数据框架的特定结构。我希望你没有花太多时间来搞清楚。 – AnjaM 2013-02-15 08:20:15