You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:17:29