如何对含重复行名的normal.meth矩阵取中位数去重?
处理矩阵重复行名:按行名取中位数合并
需求说明
- 针对矩阵
normal.meth:若存在重复行名,对同一行名的所有行按列取中位数后保留唯一一行;行名唯一的行直接保留 - 最终输出矩阵不得有重复行名
正确实现代码
首先加载matrixStats包,推荐两种高效实现方式:
方式一:简洁版(利用rowsum分组计算)
library(matrixStats) # 转置后按行名分组计算中位数,再转置回原结构 normal.meth <- t(rowsum(t(normal.meth), rownames(normal.meth), FUN = median))
方式二:直观版(遍历唯一行名)
library(matrixStats) # 获取所有唯一行名 unique_rownames <- unique(rownames(normal.meth)) # 初始化结果矩阵,指定行名和列名 result_matrix <- matrix(nrow = length(unique_rownames), ncol = ncol(normal.meth), dimnames = list(unique_rownames, colnames(normal.meth))) # 遍历每个唯一行名,计算对应行的列中位数 for (rn in unique_rownames) { result_matrix[rn, ] <- colMedians(normal.meth[rownames(normal.meth) == rn, , drop = FALSE]) } # 替换原矩阵 normal.meth <- result_matrix
注意:原提供的代码
sapply(split.default(normal.meth, colnames(normal.meth)), rowMedians)逻辑错误,split.default是按列拆分(列名均为唯一样本ID),无法实现按行名分组合并的需求,请勿使用。
输入示例
> dput(normal.meth[1:5,1:5]) structure(c(0.032865303709292, 0.52090224831803, 0.938794144634782, 0.0245464559203754, 0.0219459912613677, 0.0379074157666324, 0.517612501352023, 0.876290186551959, 0.0327330251402918, 0.0128121186436643, 0.0226085394857827, 0.44294311681768, 0.747965490184437, 0.0181395446476151, 0.0125454991770939, 0.0254179654232608, 0.55890575859087, 0.947559241210409, 0.0193177558971086, 0.0105052884119836, 0.0276096307433916, 0.477774759564032, 0.817474068951357, 0.0278807865780101, 0.0138086173417844), dim = c(5L, 5L), dimnames = list( c("5S_rRNA", "5S_rRNA", "5S_rRNA", "ABC", "DEF"), c("TCGA.A4.7288.11", "TCGA.BQ.5880.11", "TCGA.BQ.5879.11", "TCGA.BQ.5883.11", "TCGA.BQ.7055.11")))
期望输出
> dput(normal.meth[1:5,1:5]) structure(c(0.0328653, 0.0245464559203754, 0.0219459912613677, 0.03790742, 0.0327330251402918, 0.0128121186436643, 0.02260854, 0.0181395446476151, 0.0125454991770939, 0.02541797, 0.0193177558971086, 0.0105052884119836, 0.02760963, 0.0278807865780101, 0.0138086173417844), dim = c(3L, 5L), dimnames = list( c("5S_rRNA", "ABC", "DEF"), c("TCGA.A4.7288.11", "TCGA.BQ.5880.11", "TCGA.BQ.5879.11", "TCGA.BQ.5883.11", "TCGA.BQ.7055.11")))
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

