如何基于kegg数据框匹配子集化all.deg并生成矩阵列表?
按KEGG基因集提取差异表达基因子集并生成数据框列表
问题背景
你需要实现的需求:
- 从
kegg数据框中提取每个去重的gs_name对应的gene_symbol集合 - 根据这些基因符号,匹配
all.deg矩阵的行名,提取对应的行子集 - 将每个
gs_name对应的子集保存为单独矩阵,最终整理成数据框列表
遇到的问题:
- 嵌套循环无法正确关联
gs_name与对应gene_symbol,结果不符合预期 - 使用
tibble::rownames_to_column转换all.deg后执行inner_join,报错:Error ininner_join(): ! Join columns inxmust 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
相关产品推荐
相关产品推荐

