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

Seurat对象count矩阵替换Ensembl ID为基因名时维度不匹配报错求助

单细胞分析QC环节报错:行名长度与矩阵行数不匹配

问题背景

在小鼠骨髓单细胞分析流程中,基于Seurat对象的.RDS文件开展质量控制时,需计算线粒体基因表达占比(percent.mt)。因数据集基因以Ensembl ID命名,尝试转换为基因名后设置行名,触发长度不匹配错误。

已执行操作步骤

  • 读取.RDS文件
bonemarrow <- readRDS(file = "C:/Users/merce/Documents/Máster en Bioinformática/TFM/be8db92e-e52c-430c-b3d1-c27b506f8c2e.rds")
str(bonemarrow)
slotNames(bonemarrow)
View(bonemarrow@meta.data)
  • 提取表达count矩阵
counts_matrix <- bonemarrow@assays$RNA@counts
  • 创建新Seurat对象
bonecounts <- CreateSeuratObject(counts = counts_matrix, project = "seuratM")
bonecounts
  • 准备计算线粒体基因占比,提取Ensembl ID
View(bonecounts@meta.data)

# 计算线粒体基因表达占比
# 获取count矩阵行的Ensembl ID
ensembl_ids <- rownames(counts_matrix)
  • 加载小鼠基因组注释数据库
if (!requireNamespace("org.Mm.eg.db", quietly = TRUE)) {
    install.packages("org.Mm.eg.db")
}
library(org.Mm.eg.db)
  • 转换Ensembl ID为基因名
gene_symbols <- select(org.Mm.eg.db, keys=ensembl_ids, columns="SYMBOL", keytype="ENSEMBL")

错误信息

执行行名设置时触发如下错误:

rownames(counts_matrix) <- gene_info$external_gene_name  
Error in fixupDN.if.valid(value, x@Dim) :  
length of Dimnames[[1]] (17982) is not equal to Dim[1] (17985)

错误原因

  1. 注释匹配缺失:部分Ensembl ID在org.Mm.eg.db中无对应基因名注释,导致转换后的gene_symbols行数(17982)少于原始矩阵行数(17985)。
  2. 变量名与列名错误:代码中误用了未定义的gene_info变量,且错误调用不存在的external_gene_name列,实际应使用gene_symbols$SYMBOL。

解决方案

方案1:跳过基因名转换,直接用Ensembl ID计算线粒体占比

小鼠线粒体基因的Ensembl ID有固定特征,可直接匹配筛选,无需转换基因名:

# 从注释库筛选线粒体基因对应的Ensembl ID
mt_genes <- select(org.Mm.eg.db, keys=keys(org.Mm.eg.db, keytype="CHR"), columns="ENSEMBL", keytype="CHR")
mt_ensembl <- mt_genes[mt_genes$CHR == "MT", "ENSEMBL"]
# 匹配当前count矩阵中的线粒体ID
mt_ensembl <- intersect(mt_ensembl, rownames(counts_matrix))
# 计算percent.mt
bonecounts[["percent.mt"]] <- PercentageFeatureSet(bonecounts, features = mt_ensembl)

方案2:正确处理基因名转换,补全缺失注释

若需保留基因名转换步骤,需处理缺失匹配的ID:

# 去除重复匹配的行(部分Ensembl ID可能对应多个基因名)
gene_symbols <- gene_symbols[!duplicated(gene_symbols$ENSEMBL), ]
# 创建ID映射表,缺失注释的ID保留原Ensembl ID
id_map <- setNames(
  ifelse(is.na(gene_symbols$SYMBOL), gene_symbols$ENSEMBL, gene_symbols$SYMBOL),
  gene_symbols$ENSEMBL
)
# 生成与原矩阵行数一致的新行名,补全无匹配的ID
new_rownames <- id_map[rownames(counts_matrix)]
new_rownames[is.na(new_rownames)] <- rownames(counts_matrix)[is.na(new_rownames)]
# 设置行名并重新创建Seurat对象
rownames(counts_matrix) <- new_rownames
bonecounts <- CreateSeuratObject(counts = counts_matrix, project = "seuratM")
# 用基因名匹配线粒体基因(小鼠线粒体基因名以mt-开头)
bonecounts[["percent.mt"]] <- PercentageFeatureSet(bonecounts, pattern = "^mt-")

关键注意事项

  • 避免直接修改原始Seurat对象的count矩阵,建议处理后重新创建对象。
  • 使用PercentageFeatureSet时,需根据当前行名类型(Ensembl ID/基因名)选择匹配方式。

内容的提问来源于stack exchange,提问作者Mercedes Jiménez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:15:37