在R语言中按列A分组聚合列F的所有对应基因
问题描述
给定如下R语言数据框df,需要将列A(第1列)中每个唯一SNP对应的列F(第6列)的所有基因收集汇总,同时去除重复的基因条目,得到按SNP分组的基因集合。
原始数据框
df <- structure(list(A = c("rs1544968", "rs1544968", "rs1544968", "rs1544968", "rs1544968", "rs1544968", "rs1544968", "rs1544968", "rs1544968", "rs1544968", "rs60296873", "rs60296873", "rs2811442", "rs2811442", "rs2811442", "rs2811442"), B = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 10L, 10L, 3L, 3L, 3L, 3L), C = c("2.37E+08", "2,37E+08", "2.37E+08", "2,37E+08", "2.37E+08", "2,37E+08", "2.37E+08", "2,37E+08", "2.37E+08", "2,37E+08", "33171937", "33171937", "1,3E+08", "1,3E+08", "1,3E+08", "1,3E+08"), D = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"), E = c("G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G"), F = c("ENSG00000116984", "ENSG00000186197", "ENSG00000119285", "ENSG00000077522", "ENSG00000077522", "ENSG00000116977", "ENSG00000244020", "ENSG00000086619", "ENSG00000198626", "ENSG00000077585", "ENSG00000150093", "ENSG00000099250", "ENSG00000172765", "ENSG00000170893", "ENSG00000172765", "ENSG00000170893")), class = "data.frame", row.names = c(NA, -16L))
解决方案
方法一:Base R 实现
利用aggregate()函数按列A分组,对列F去重后汇总:
result_base <- aggregate(F ~ A, data = df, FUN = function(x) paste(unique(x), collapse = ", ")) print(result_base)
- 说明:先通过
unique(x)去除每组内的重复基因,再用paste(..., collapse = ", ")将基因拼接为字符串;F ~ A指定按列A分组汇总列F。
方法二:Tidyverse (dplyr) 实现
如果习惯使用tidyverse语法,可通过分组、去重、汇总三步完成:
library(dplyr) result_dplyr <- df %>% group_by(A) %>% distinct(F) %>% summarise(genes = paste(F, collapse = ", ")) %>% ungroup() print(result_dplyr)
- 说明:
group_by(A):按列A的SNP值分组;distinct(F):剔除每组内重复的基因条目;summarise(genes = paste(F, collapse = ", ")):将每组基因拼接为字符串;ungroup():取消分组状态,得到普通数据框。
输出结果示例
两种方法都会得到如下格式的结果:
A genes 1 rs1544968 ENSG00000116984, ENSG00000186197, ENSG00000119285, ENSG00000077522, ENSG00000116977, ENSG00000244020, ENSG00000086619, ENSG00000198626, ENSG00000077585 2 rs2811442 ENSG00000172765, ENSG00000170893 3 rs60296873 ENSG00000150093, ENSG00000099250
内容的提问来源于stack exchange,提问作者user3683485
相关产品推荐
相关产品推荐

