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

如何基于kegg数据框匹配子集化all.deg并生成矩阵列表?

按KEGG基因集提取差异表达基因子集并生成数据框列表

问题背景

你需要实现的需求:

  • 从kegg数据框中提取每个去重的gs_name对应的gene_symbol集合
  • 根据这些基因符号,匹配all.deg矩阵的行名,提取对应的行子集
  • 将每个gs_name对应的子集保存为单独矩阵,最终整理成数据框列表

遇到的问题:

  1. 嵌套循环无法正确关联gs_name与对应gene_symbol,结果不符合预期
  2. 使用tibble::rownames_to_column转换all.deg后执行inner_join,报错:Error in inner_join(): ! Join columns in xmust be present in the data. ✖ Problem withgene`

解决方案

核心思路

先按gs_name对kegg数据分组,提取每个基因集对应的基因符号列表;再遍历列表,在all.deg中匹配行名提取子集,最终整理为命名列表。

代码实现

# 加载所需包
library(dplyr)
library(purrr)

# 1. 从kegg数据框中提取每个gs_name对应的基因符号列表
gene_sets <- kegg %>%
  group_by(gs_name) %>%
  summarise(genes = list(unique(gene_symbol))) %>%
  tibble::deframe()  # 转换为以gs_name为名称的列表,每个元素是基因向量

# 2. 遍历每个基因集,提取all.deg的对应行子集
deg_list <- map(gene_sets, function(genes) {
  # 筛选同时存在于all.deg行名中的基因
  matched_genes <- intersect(genes, rownames(all.deg))
  # 提取子集,保留原矩阵/数据框结构
  if (length(matched_genes) > 0) {
    subset(all.deg, rownames(all.deg) %in% matched_genes)
  } else {
    NULL  # 无匹配基因时返回NULL,可根据需求改成空数据框
  }
})

# 可选:过滤掉无匹配基因的空元素
deg_list <- deg_list[!sapply(deg_list, is.null)]

针对inner_join错误的排查

你遇到的错误是因为列名不匹配:转换all.deg时指定的列名和kegg中的基因列名不一致。如果想用inner_join实现,修正后的写法如下:

library(tibble)

# 把all.deg的行名转为列,列名和kegg中的基因列保持一致
all.deg_tbl <- all.deg %>% rownames_to_column(var = "gene_symbol")

# 按gs_name分组提取子集
deg_list <- kegg %>%
  group_by(gs_name) %>%
  group_map(function(.x, .y) {
    all.deg_tbl %>%
      filter(gene_symbol %in% .x$gene_symbol) %>%
      column_to_rownames(var = "gene_symbol")  # 恢复行名结构
  }, .keep = TRUE)

# 给列表命名,对应每个gs_name
names(deg_list) <- unique(kegg$gs_name)

示例验证

比如你提到的FTL基因,假设它属于某个gs_name(例如hsa00830),直接通过deg_list[["hsa00830"]]就能获取all.deg中FTL对应的行数据。

内容的提问来源于stack exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:41