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需要的是样本水平的计数矩阵,而非单个细胞的矩阵,所以不能直接修改行名,必须先按样本分组汇总细胞计数:
提取样本标识并分组求和
从原始行名中提取样本标签,再按样本分组对计数矩阵进行汇总:cts.split.modified <- lapply(cts.split, function(x) { # 提取样本分组信息 sample_ids <- gsub(".*_(.*_.*)_.*", "\\1", rownames(x)) # 按样本分组汇总,得到基因×样本的计数矩阵 aggregate(t(x), by = list(Sample = sample_ids), FUN = sum) })整理矩阵格式
将样本名设为列名,调整为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

