如何分组重复行名并汇总对应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
相关产品推荐
相关产品推荐

