在R中创建热图报错:'x'必须是数值型矩阵的解决方法
解决R中热图报错的步骤
问题根源分析
Error in heatmap(df) : 'x' must be a numeric matrix:你的矩阵包含字符型数据(第一列是观测名称,数值列也被存为字符格式),不符合heatmap()对输入的要求。Error in df[,1]: object of type 'closure' is not subsettable:当前df变量被覆盖成了R内置的df()函数(用于计算F分布密度),需要重新加载数据。
具体解决步骤
1. 重新加载数据(避免变量冲突)
把你提供的dput内容赋值给新变量dat,避免和内置函数重名:
dat <- structure(c("observation_1", "observation_2", "observation_3", "observation_4", "observation_5", "observation_6", "observation_7", "observation_8", "observation_9", "observation_10", "observation_11", "observation_12", "observation_13", "observation_14", "0.3582493", "0.3649155", "0.2787633", "0.1632812", "0.8172198", "0.8823394", "0.7073695", "0.9631311", "0.0157979", "0.2150821", "0.9037031", "0.8703745", "1.1638085", "1.0331578", "2.7990972", "2.7087826", "3.3461678", "6.5408849", "1.1854820", "1.1648704", "1.3596062", "1.0350262", "9.8674869", "3.4583656", "1.0800011", "1.1129240", "0.9125615", "0.9621767"), dim = c(14L, 3L), dimnames = list( NULL, c("X", "X..changes.site_1", "X..changes.site_2")))
2. 转换为符合要求的数值矩阵
- 将第一列的观测名称设为行名
- 把数值列从字符型转为数值型:
# 设置行名 rownames(dat) <- dat[, 1] # 提取数值列并转换为数值矩阵 num_matrix <- apply(dat[, -1], 2, as.numeric)
3. 绘制热图
现在可以正常执行热图命令:
heatmap(num_matrix)
可选:用tidyverse简化处理
如果你习惯使用tidyverse工具包,可用更直观的代码完成转换:
library(tidyverse) # 转换为数据框、重命名列、转数值、设置行名、转矩阵 dat_matrix <- as.data.frame(dat) %>% rename(observation = X, site1 = X..changes.site_1, site2 = X..changes.site_2) %>% mutate(across(c(site1, site2), as.numeric)) %>% column_to_rownames(var = "observation") %>% as.matrix() # 绘制热图 heatmap(dat_matrix)
内容的提问来源于stack exchange,提问作者echo2249
相关产品推荐
相关产品推荐

