R语言:基于hallmark.df匹配all.deg并筛选行的实现方案
问题解决:从Hallmark基因集匹配表达数据并筛选行
需求说明
- 遍历
hallmark.df的每一行,提取all.deg中行名与该行任意基因名匹配的行,生成对应Hallmark条目的子集列表 - 仅保留
hallmark.df中非NA列数大于25且小于500的行
错误代码
subset.df <- by(hallmark.df, seq_len(nrow(hallmark.df)), function(row) ifelse(all.deg[rownames(all.deg) %in% hallmark.df,]))
输入数据
all.deg前5行5列数据
> dput(all.deg[1:5,1:5]) structure(c(16.0169585624867, 14.3983080662428, 12.7844219145156, 12.6674945373237, 13.8584047354367, 13.563719599839, 13.6166993468069, 12.9748157402651, 12.7386065050292, 12.2201616898331, 11.3657998135948, 11.8253392160132, 12.1132082166185, 11.5123143882139, 10.2967924742924, 13.7513874043739, 13.2403954818698, 12.4196432226432, 12.4676109090624, 12.1390647972695, 12.3013113392588, 12.4867673484914, 11.3693921877853, 10.6359730348998, 10.0122721528039), dim = c(5L, 5L), dimnames = list( c("JUNB", "ALDOA", "HLA.A", "THBD", "CD74"), c("TCGA.2K.A9WE.01", "TCGA.2Z.A9J1.01", "TCGA.2Z.A9J3.01", "TCGA.2Z.A9J6.01", "TCGA.2Z.A9J7.01")))
hallmark.df前5行5列数据
> dput(hallmark.df[1:5,1:5]) structure(list(V3 = c("JUNB", "PGK1", "FDPS", "ARHGEF2", "CD74" ), V4 = c("CXCL2", "PDK1", "CYP51A1", "CLASP1", "CTNNB1"), V5 = c("ATF3", "GBE1", "IDI1", "KIF11", "JAG2"), V6 = c("NFKBIA", "PFKL", "FDFT1", "KIF23", "NOTCH1"), V7 = c("ALDOA", "JUNB", "DHCR7", "ALS2", "DLL1")), row.names = c("HALLMARK_TNFA_SIGNALING_VIA_NFKB", "HALLMARK_HYPOXIA", "HALLMARK_CHOLESTEROL_HOMEOSTASIS", "HALLMARK_MITOTIC_SPINDLE", "HALLMARK_WNT_BETA_CATENIN_SIGNALING"), class = "data.frame")
正确代码及解释
原代码存在两个核心问题:by函数用法错误,且未处理非NA列数筛选;ifelse不适合用于提取数据框行。以下是修正后的代码:
# 1. 筛选hallmark.df中符合非NA列数要求的行 filtered_hallmark <- hallmark.df[rowSums(!is.na(hallmark.df)) > 25 & rowSums(!is.na(hallmark.df)) < 500, ] # 2. 遍历筛选后的行,匹配all.deg的行名并提取对应子集 df.list <- lapply(seq_len(nrow(filtered_hallmark)), function(i) { # 将当前行转为字符向量,过滤NA值 current_genes <- as.character(filtered_hallmark[i, ]) current_genes <- current_genes[!is.na(current_genes)] # 提取all.deg中匹配的行 matched_rows <- all.deg[rownames(all.deg) %in% current_genes, ] # 仅保留有匹配结果的子集(避免空数据框) if(nrow(matched_rows) > 0) matched_rows else NULL }) # 为列表元素命名,对应Hallmark条目名称 names(df.list) <- rownames(filtered_hallmark) # 移除空元素(无匹配结果的条目) df.list <- Filter(Negate(is.null), df.list)
结果验证
以示例数据测试:
HALLMARK_TNFA_SIGNALING_VIA_NFKB行匹配到JUNB和ALDOA,对应all.deg的前两行HALLMARK_WNT_BETA_CATENIN_SIGNALING行匹配到CD74,对应all.deg的第五行- 其余行无匹配基因,会被过滤出最终列表,与预期输出一致。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

