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

合并多数据框时去重行名并取均值的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:24:52