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

scRNA-seq数据DESeq2分析行名重复报错问题求助

问题:scRNA-seq DESeq2分析中行名修改报错处理

我正在对scRNA-seq数据集进行DESeq2分析,cts.split中的行名格式如Glial Cells_FLOX_A18_AAACGGGTCAGGCCCA-1(共14000条)。尝试用以下循环函数修改行名,去除第一个下划线前和第三个下划线后的内容,将行名改为FLOX_A18:

cts.split.modified<- lapply(cts.split, function(x){ 
  rownames(x)<-gsub(".*_(.*_.*)_.*", '\\1', rownames(x)) 
  t(x)
})

但出现报错:

Error in .rowNamesDF<-(x, value = value) :
duplicate 'row.names' are not allowed
In addition: Warning message:
Error in .rowNamesDF<-(x, value = value) :
duplicate 'row.names' are not allowed

尝试替换行名但无效,请问如何解决该问题让函数正常运行?


解决方案

报错原因

你的gsub处理后会生成大量重复行名(比如所有来源为FLOX_A18的细胞都会被改成同一个行名),而R的数据框/矩阵不允许重复行名,因此触发报错。

解决方法

DESeq2需要的是样本水平的计数矩阵,而非单个细胞的矩阵,所以不能直接修改行名,必须先按样本分组汇总细胞计数:

  1. 提取样本标识并分组求和
    从原始行名中提取样本标签,再按样本分组对计数矩阵进行汇总:

    cts.split.modified <- lapply(cts.split, function(x) {
      # 提取样本分组信息
      sample_ids <- gsub(".*_(.*_.*)_.*", "\\1", rownames(x))
      # 按样本分组汇总,得到基因×样本的计数矩阵
      aggregate(t(x), by = list(Sample = sample_ids), FUN = sum)
    })
    
  2. 整理矩阵格式
    将样本名设为列名,调整为DESeq2常用的样本×基因格式:

    cts.split.modified <- lapply(cts.split.modified, function(df) {
      rownames(df) <- df$Sample
      # 删除Sample列,转置为样本×基因矩阵
      t(df[, -1, drop = FALSE])
    })
    

补充说明

DESeq2的输入要求每个样本对应唯一的行/列名,且计数是样本的总表达量。单个细胞属于同一个样本的话,必须先汇总才能得到符合要求的输入矩阵,直接修改行名会导致重复,这是R数据结构的硬性限制。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:55:15