合并多数据框时去重行名并取均值的R代码报错排查
问题排查与修正方案
第一步:先解决原始数据框的行名重复问题
报错提示Dendritic等行名非唯一,大概率是某个输入数据框本身存在重复行名,这是触发报错的核心原因。先检查并处理:
# 检查每个数据框的行名是否重复 any(duplicated(rownames(methylresolver.output))) any(duplicated(rownames(EPICdeconv.output))) any(duplicated(rownames(methylcibersort.output)))
如果某数据框返回TRUE,说明存在重复行名,先对其去重(按行名分组取均值):
# 处理 methylresolver.output 重复行名(另外两个数据框同理) if(any(duplicated(rownames(methylresolver.output)))){ methylresolver.output <- aggregate(. ~ rownames(methylresolver.output), data = methylresolver.output, FUN = mean) rownames(methylresolver.output) <- methylresolver.output[,1] methylresolver.output <- methylresolver.output[,-1] }
第二步:提取公共列并合并计算均值
完成原始数据去重后,按需求处理公共列和行名合并:
# 1. 获取三个数据框的公共列名 common_cols <- Reduce(intersect, list(colnames(methylresolver.output), colnames(EPICdeconv.output), colnames(methylcibersort.output))) # 2. 对三个数据框做子集化,仅保留公共列 mr_sub <- methylresolver.output[, common_cols, drop = FALSE] ed_sub <- EPICdeconv.output[, common_cols, drop = FALSE] mc_sub <- methylcibersort.output[, common_cols, drop = FALSE] # 3. 合并三个数据框,按行名分组计算均值 all_combined <- rbind(mr_sub, ed_sub, mc_sub) # 按行名分组,对每组的行取均值 meth_deconv <- do.call(rbind, tapply(1:nrow(all_combined), rownames(all_combined), function(idx) colMeans(all_combined[idx, , drop = FALSE], na.rm = TRUE)))
验证结果
最后确认输出数据框的行名唯一性:
any(duplicated(rownames(meth_deconv)))
返回FALSE说明问题解决。
补充说明
- 如果你的数据存在NA值,
na.rm = TRUE会自动忽略这些值计算均值,不需要可以直接删除该参数。 - 若偏好tidyverse语法,也可以用以下实现:
library(tidyverse) # 子集化公共列后转换为长格式合并 combined_long <- bind_rows( mr_sub %>% rownames_to_column("cell_type") %>% pivot_longer(-cell_type, names_to = "sample", values_to = "value"), ed_sub %>% rownames_to_column("cell_type") %>% pivot_longer(-cell_type, names_to = "sample", values_to = "value"), mc_sub %>% rownames_to_column("cell_type") %>% pivot_longer(-cell_type, names_to = "sample", values_to = "value") ) # 分组求均值后转回宽格式 meth_deconv <- combined_long %>% group_by(cell_type, sample) %>% summarise(mean_val = mean(value, na.rm = TRUE)) %>% pivot_wider(names_from = sample, values_from = mean_val) %>% column_to_rownames("cell_type")
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

