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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:04:51