如何用R的purrr/dplyr优雅找出重复基因所属分组?
优雅识别差异基因分组中的跨组重复基因(dplyr/purrr实现)
针对你需要检测差异基因分组中跨组重复基因的需求,这里提供两种基于tidyverse工具链的简洁实现方案,替代繁琐的嵌套lapply:
方案一:dplyr + tidyr 纯tidy风格实现
这种方式通过将列表转换为结构化数据框,用分组统计快速定位重复基因:
library(dplyr) library(tidyr) # 处理基因分组列表,筛选出跨组重复的基因及其所属分组 duplicate_genes <- FocusedGenes %>% # 将列表转换为"分组-基因"的键值对数据框 enframe(name = "group", value = "gene") %>% # 展开每个分组下的基因 unnest(cols = gene) %>% # 按基因分组,筛选出出现在多个分组的基因 group_by(gene) %>% filter(n() > 1) %>% # 将每个基因所属的分组合并为字符串 summarise(所属分组 = paste(group, collapse = ", "), .groups = "drop") # 查看结果 print(duplicate_genes)
输出示例:
# A tibble: 5 × 2 gene 所属分组 <chr> <chr> 1 Atf4 ISR_Genes, Perk_Genes, Transcription_Genes 2 Ddit3 ISR_Genes, Transcription_Genes 3 Nfe2l2 ISR_Genes, Perk_Genes, Transcription_Genes 4 Ptpn2 ISR_Genes, Perk_Genes, Transcription_Genes 5 Bok ISR_Genes, Perk_Genes
方案二:purrr 函数式风格实现
如果更倾向于函数式编程,用purrr可以直接构建基因到分组的映射:
library(purrr) library(tibble) # 构建每个基因对应的分组列表 gene_group_map <- imap(FocusedGenes, ~set_names(rep(.y, length(.x)), .x)) %>% reduce(c) # 转换为数据框并筛选重复基因 duplicate_genes_purrr <- gene_group_map %>% enframe(name = "gene", value = "group") %>% group_by(gene) %>% filter(n() > 1) %>% summarise(所属分组 = paste(group, collapse = ", "), .groups = "drop")
额外:自动生成用户提醒
可以基于上述结果直接生成友好的冗余提示,无需手动拼接:
library(glue) duplicate_genes %>% rowwise() %>% walk(~message(glue("警告:基因 {.x$gene} 同时属于分组 {.x$所属分组},存在分组冗余")))
输出的提示信息会直接在控制台打印,方便用户快速定位问题。
内容的提问来源于stack exchange,提问作者Nick M
相关产品推荐
相关产品推荐

