如何在R中提取仅存在于单一疾病组的独有基因?
问题描述
我有一个包含30000行数据的dataframe,结构如下:
gene logFC adj.p.val disease 1 SYT11 1.9678590 3.542121e-09 DN 2 PPT1 0.7349565 5.239188e-09 DN 3 PHLDA2 2.7419282 5.478323e-08 DN 4 TGFBI 1.6491225 5.478323e-08 DN 5 CRIP1 1.6476587 2.342271e-07 DN 6 TIGAR 1.2751720 2.342271e-07 DN
disease列的因子水平为:
levels(as.factor(pfilter_hdata$disease)) [1] "DN" "FSGS" "FSGS-MCD" "HN" "IgAN" "LN" "MCD" "MGN" "RPGN"
需要提取每个疾病组相对于其他所有疾病的独有基因(即仅存在于该疾病组、不存在于其他任何疾病组的基因),并将每个疾病组的独有基因保存为单独文件。
解决方案
以下提供两种实现方式,可根据自己的习惯选择:
方法一:使用dplyr(tidyverse工具链)
先确保已安装并加载dplyr包:
# 若未安装dplyr,先执行安装 # install.packages("dplyr") library(dplyr)
步骤1:数据预处理(可选,去重)
如果同一个基因在同一疾病组存在多行重复数据,先去重确保每个基因-疾病组合唯一:
pfilter_hdata <- pfilter_hdata %>% distinct(gene, disease, .keep_all = TRUE)
步骤2:筛选独有基因并保存
# 统计每个基因对应的所有疾病组 gene_disease_dist <- pfilter_hdata %>% group_by(gene) %>% summarise(disease_groups = list(unique(disease)), .groups = "drop") # 筛选仅属于单一疾病组的基因,并关联对应的疾病 unique_genes <- gene_disease_dist %>% filter(lengths(disease_groups) == 1) %>% mutate(disease = unlist(disease_groups)) # 按疾病分组,将每个疾病的独有基因数据保存为CSV文件 unique_genes %>% group_by(disease) %>% group_walk(function(data, key) { # 匹配原数据中的完整信息 result_data <- pfilter_hdata %>% filter(gene %in% data$gene) # 生成文件名并保存,例如"DN_unique_genes.csv" write.csv(result_data, paste0(key$disease, "_unique_genes.csv"), row.names = FALSE) })
方法二:使用Base R(无需额外包)
步骤1:数据预处理(可选,去重)
# 去重,保留每个基因-疾病组合的第一行 pfilter_hdata <- pfilter_hdata[!duplicated(pfilter_hdata[c("gene", "disease")]), ]
步骤2:筛选独有基因并保存
# 统计每个基因出现的所有疾病组 gene_disease_map <- tapply(pfilter_hdata$disease, pfilter_hdata$gene, unique) # 筛选仅在单个疾病组出现的基因 single_disease_genes <- names(gene_disease_map[sapply(gene_disease_map, length) == 1]) # 将基因按所属疾病分组 disease_gene_list <- split(single_disease_genes, sapply(single_disease_genes, function(g) gene_disease_map[[g]])) # 遍历每个疾病,保存对应独有基因的数据 for(disease_name in names(disease_gene_list)) { target_genes <- disease_gene_list[[disease_name]] result_data <- pfilter_hdata[pfilter_hdata$gene %in% target_genes, ] write.csv(result_data, paste0(disease_name, "_unique_genes.csv"), row.names = FALSE) }
说明
- 运行完成后,工作目录下会生成以
疾病名_unique_genes.csv命名的文件,每个文件对应该疾病的独有基因完整数据。 - 如果需要其他格式(如TSV),可将
write.csv替换为write.table并设置sep = "\t"。
内容的提问来源于stack exchange,提问作者user3683485
相关产品推荐
相关产品推荐

