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

R语言中基因名设为行名及热图绘制报错求助

问题解决:热图基因名标签设置与格式错误修复

核心问题分析

你的操作存在两个关键问题:

  • 行名设置失败:合并过程中列名语法错误导致基因名重复,或读取文件时行名处理逻辑混乱
  • 热图绘制失败:输入数据是包含非数值列的数据框,不符合heatmap()要求的数值矩阵格式

步骤1:修正Biomart ID匹配与数据合并

你的Biomart代码存在merge参数语法错误,先重新整理ID匹配与数据合并流程:

library(biomaRt)
# 初始化猪的Ensembl数据库
ensembl <- useMart("ensembl", dataset = "sscrofa_gene_ensembl")
# 读取原始计数数据(假设原数据行名为Ensembl ID)
mat.z <- read.delim("matz.csv", header = TRUE, sep = ",")
# 提取Ensembl ID作为向量(避免转成数据框导致列名混乱)
my_ids <- rownames(mat.z)
# 匹配Ensembl ID与基因名
results_end_1 <- getBM(
  attributes = c("ensembl_gene_id", "external_gene_name"),
  values = my_ids,
  mart = ensembl
)
# 合并原始数据与匹配结果(用Ensembl ID关联)
mat.z_merged <- merge(
  mat.z,
  results_end_1,
  by.x = "row.names",  # 用原始数据的行名(Ensembl ID)作为匹配键
  by.y = "ensembl_gene_id"
)
# 替换Ensembl ID为基因名,无匹配的保留原ID
mat.z_merged$Row.names <- ifelse(
  is.na(mat.z_merged$external_gene_name),
  mat.z_merged$Row.names,
  mat.z_merged$external_gene_name
)
# 移除多余的基因名列
mat.z_merged <- mat.z_merged[, !colnames(mat.z_merged) %in% "external_gene_name"]

步骤2:正确设置行名并处理重复问题

问题根源

报错duplicate 'row.names' are not allowed说明:部分基因名重复(多个Ensembl ID对应同一基因名),或合并过程中产生了重复行。

解决方案

# 检查重复的基因名
dup_genes <- mat.z_merged$Row.names[duplicated(mat.z_merged$Row.names)]
print(unique(dup_genes))

# 给重复基因名加后缀(如_1、_2),确保行名唯一
mat.z_merged$Row.names <- make.unique(mat.z_merged$Row.names, sep = "_")

# 设置行名并移除原Row.names列
rownames(mat.z_merged) <- mat.z_merged$Row.names
mat.z_final <- mat.z_merged[, -which(colnames(mat.z_merged) == "Row.names")]

# 验证行名唯一性
any(duplicated(rownames(mat.z_final)))  # 正常应返回FALSE

步骤3:转换为数值矩阵绘制热图

heatmap()要求输入为数值矩阵,需将数据框转换为矩阵格式:

# 转换为数值矩阵(确保所有计数列都是数值型)
mat.z_matrix <- as.matrix(mat.z_final)
# 检查矩阵类型
class(mat.z_matrix)  # 应返回"matrix"

# 绘制热图
heatmap(
  mat.z_matrix,
  cluster_rows = TRUE,
  cluster_columns = TRUE,
  name = "z-score",
  column_labels = colnames(mat.z_matrix),
  col = pal,
  legend = TRUE,
  annotation_col = coldata,
  cutree_rows = 2,
  main = "Heatmap of DEGS Normalized Counts in Pig Samples"
)

额外注意事项

  1. 保存/读取数据时简化行名处理:用write.csv(mat.z_final, "matszo.csv", row.names = TRUE)保存后,下次读取直接用read.csv("matszo.csv", row.names = 1),无需额外调整行名
  2. 提前检查数据类型:用str(mat.z)查看各列类型,确保计数列均为数值型,避免矩阵转换失败
  3. 处理Biomart匹配缺失:用sum(is.na(results_end_1$external_gene_name))统计未匹配到基因名的ID数量,提前确认数据完整性

内容的提问来源于stack exchange,提问作者Rob Staruch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:45:37