You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中创建热图报错:'x'必须是数值型矩阵的解决方法

解决R中热图报错的步骤

问题根源分析

  1. Error in heatmap(df) : 'x' must be a numeric matrix:你的矩阵包含字符型数据(第一列是观测名称,数值列也被存为字符格式),不符合heatmap()对输入的要求。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:28:19