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

基于geneNames列重复值合并对应probeID列(R语言数据框处理)

R数据框:合并重复基因名对应的探针ID

需求

当数据框的geneNames列存在重复值时,将对应probeID列的所有值用;拼接合并,每个geneNames仅保留一条记录。

输入数据

meth.anno.2 <- structure(list(
  probeID = c("cg13869341", "cg14008030", "cg12045430", 
              "cg20826792", "cg00381604", "cg20253340", "cg21870274", "cg03130891", 
              "cg24335620", "cg16162899"),
  geneNames = c("WASH7P", "MIR6859-1", "MIR1302-2", "MIR1302-2", "MIR1302-2", 
                "OR4F5", "OR4F5", "AL627309", "AL627309", "AL732372")
), row.names = c(NA, 10L), class = "data.frame")

问题分析

你尝试的代码meth.anno.2 <- paste(meth.anno.2$probeID,";")[duplicated(meth.anno.2$geneNames)]逻辑有误:它仅提取了geneNames重复行的probeID并添加分号,既没有按基因名分组合并所有对应探针ID,也未保留唯一的基因名记录,因此无法实现需求。

解决方案

方法1:用dplyr(tidyverse工具链)

这是更直观的tidy风格写法,先加载dplyr包,按geneNames分组后拼接probeID:

# 首次使用需安装包
# install.packages("dplyr")
library(dplyr)

meth.anno.merged <- meth.anno.2 %>%
  group_by(geneNames) %>%
  summarise(probeID = paste(probeID, collapse = ";"), .groups = "drop")

方法2:用Base R的aggregate函数

无需额外安装包,直接用基础R函数实现分组合并:

meth.anno.merged <- aggregate(probeID ~ geneNames, data = meth.anno.2, 
                              FUN = function(x) paste(x, collapse = ";"))

输出验证

运行上述任意代码后,得到的结果与你的期望一致(行顺序可能略有差异,但数据内容完全符合要求):

> dput(meth.anno.merged)
structure(list(geneNames = c("AL627309", "AL732372", "MIR1302-2", 
"MIR6859-1", "OR4F5", "WASH7P"), probeID = c("cg03130891;cg24335620", 
"cg16162899", "cg12045430;cg20826792;cg00381604", "cg14008030", 
"cg20253340;cg21870274", "cg13869341")), class = "data.frame", row.names = c(NA, 
-6L))

若需要和期望输出完全一致的行顺序,可在合并后添加排序逻辑:

# 按原始数据的基因名出现顺序排序
meth.anno.merged <- meth.anno.merged[match(unique(meth.anno.2$geneNames), meth.anno.merged$geneNames), ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:03:11