如何在R中将计数对象的Ensembl基因ID合并至新列?
问题
我有一份带biotype注释的Ensembl基因数据集,已经写出代码按biotype统计各类型基因的数量:
genes <- c("ENSG01","ENSG02","ENSG03","ENSG04","ENSG05") biotype <- c("protein_coding","protein_coding","protein_coding","lncRNA","lncRNA") data <- data.frame(genes, biotype) data genes biotype 1 ENSG01 protein_coding 2 ENSG02 protein_coding 3 ENSG03 protein_coding 4 ENSG04 lncRNA 5 ENSG05 lncRNA data_cts <- data %>% group_by(biotype) %>% dplyr::count() data_cts # A tibble: 2 × 2 # Groups: biotype [2] biotype n <chr> <int> 1 lncRNA 2 2 protein_coding 3
现在需要把每个biotype对应的基因ID用/分隔合并成新列,得到如下格式的结果:
ENSEMBL <- c("ENSG04/ENSG05","ENSG01/ENSG02/ENSG03") data_genes <- data.frame(data_cts, ENSEMBL) data_genes biotype n ENSEMBL 1 lncRNA 2 ENSG04/ENSG05 2 protein_coding 3 ENSG01/ENSG02/ENSG03
请问该怎么实现?
解决方案
可以直接在group_by(biotype)之后用summarize()一步完成数量统计与基因ID合并,无需分开处理再拼接:
library(dplyr) # 原始数据 genes <- c("ENSG01","ENSG02","ENSG03","ENSG04","ENSG05") biotype <- c("protein_coding","protein_coding","protein_coding","lncRNA","lncRNA") data <- data.frame(genes, biotype) # 统计+合并一步到位 data_genes <- data %>% group_by(biotype) %>% summarize( n = n(), # 统计每个biotype的基因数 ENSEMBL = paste(genes, collapse = "/") # 用/分隔合并基因ID ) %>% ungroup() # 取消分组,避免后续操作受分组状态影响 # 查看结果 data_genes
运行后输出结果完全符合需求:
# A tibble: 2 × 3 biotype n ENSEMBL <chr> <int> <chr> 1 lncRNA 2 ENSG04/ENSG05 2 protein_coding 3 ENSG01/ENSG02/ENSG03
补充说明
paste(genes, collapse = "/")是核心逻辑:将分组内的genes列元素用/连接成单个字符串- 若习惯用
stringr包,也可以替换为stringr::str_c(genes, collapse = "/"),效果完全一致 ungroup()为可选操作,若后续无需修改该数据框,可省略此步骤
内容的提问来源于stack exchange,提问作者Dswede43
相关产品推荐
相关产品推荐

