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

如何分组重复行名并汇总对应ID列表 生成无重复dataframe

解决方案

你可以根据使用习惯选择以下任意一种实现方式,以下示例假设你的原始数据集存储为名为human_gs的data.frame。如果觉得原始带前缀的列名输入麻烦,可以先执行重命名简化操作:

colnames(human_gs) <- c("gs_name", "entrez_gene")

方法一:tidyverse 实现(推荐,代码可读性高)

加载dplyr和tidyr包,按基因集名分组汇总为列表后转宽表即可:

library(dplyr)
library(tidyr)

# 若需要基因ID输出为和示例一致的带引号字符格式,先执行类型转换
human_gs$entrez_gene <- as.character(human_gs$entrez_gene)

gs_wide <- human_gs %>%
  group_by(gs_name) %>%
  # 若需要去除同基因集下重复的基因ID,把下面的entrez_gene替换为unique(entrez_gene)
  summarise(gene_set = list(entrez_gene), .groups = "drop") %>%
  pivot_wider(names_from = gs_name, values_from = gene_set)

生成的gs_wide就是目标结构:列名为去重后的gs_name,每列存储对应基因集关联的所有entrez gene值。
要查看指定基因集的基因列表,用双层索引取出内层向量即可,输出格式和你给出的预期完全一致:

# 示例:查看HALLMARK_PANCREAS_BETA_CELLS对应的基因列表
gs_wide$HALLMARK_PANCREAS_BETA_CELLS[[1]]

方法二:Base R 实现(无需安装第三方包)

不依赖额外扩展包的原生实现逻辑更直接,先按分组拆分再组装为数据框:

# 若需要字符格式ID,提前转换类型
human_gs$entrez_gene <- as.character(human_gs$entrez_gene)
# 按gs_name拆分得到基因列表分组,加unique可去重
split_gs <- split(human_gs$entrez_gene, human_gs$gs_name)
# 转为宽格式数据框
gs_wide <- as.data.frame(lapply(split_gs, list))

注意事项

  • 由于data.frame原生不支持直接存储长度不一致的向量作为单独列,所以结果中每列实际是长度为1的列表对象,列表的第一个元素才是对应基因集的entrez ID向量,这也是提取内容时需要加[[1]]的原因
  • 如果需要导出结果到本地文件,建议遍历每列的基因列表单独写入,不要直接用write.csv等函数操作整个宽表,否则会得到列表对象的类型标识而非实际基因值

内容的提问来源于stack exchange,提问作者C. van Veen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:45:43