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

从基因ID向量匹配列表子集元素并生成对应数据框列表

需求说明

我有一个包含基因ID的向量,需要识别列表中每个子数据框是否包含这些ID,并提取对应的p值。修正后的预期结果是:每个子列表对应一个数据框,包含三列:

  • gene_ids:目标基因ID
  • in_list:布尔值,标识该基因是否存在于当前子列表中
  • pval:该基因对应的p值,不存在则为NA

示例数据

the_list <- list(
  a = data.frame(ids = c("ABB", 'SDG', 'SHD', 'DUR'), pval = c(0.01, 0.03, 0.05, 0.05)),
  b = data.frame(ids =c('DYR' ,'LRH' ,'FPR', 'FUR', 'DCTWE', 'IRN', 'DRB'), pval = c(0.01, 0.03, 0.05, 0.05, 4, 5, 6)),
  c = data.frame(ids =c('SYR' ,'SDT', 'DFN' ,'FRQ' ,'DFRR', 'SDR'), pval = c(0.01, 0.03, 0.05, 0.05, 5, 2))
)

the_vector <- c("ABB", 'FUR', 'DFN')

# 预期输出
expected_result <- list(
  'a' = data.frame(
    gene_ids = c("ABB", 'FUR', 'DFN'),
    in_list = c(T, F, F),
    pval = c(0.01, NA, NA)),
  'b' = data.frame(
    gene_ids = c("ABB", 'FUR', 'DFN'),
    in_list = c(F, T, F),
    pval = c(NA, 0.05, NA)),
  'c' = data.frame(
    gene_ids = c("ABB", 'FUR', 'DFN'),
    in_list = c(F, F, T),
    pval = c(NA,  NA, 0.05))
)

解决方案

可以用lapply遍历the_list中的每个子数据框,结合match函数完成匹配和值提取:

result <- lapply(the_list, function(df) {
  # 获取目标基因在当前子数据框中的匹配位置
  match_pos <- match(the_vector, df$ids)
  # 构建结果数据框
  data.frame(
    gene_ids = the_vector,
    in_list = !is.na(match_pos),
    pval = ifelse(is.na(match_pos), NA, df$pval[match_pos])
  )
})

# 查看结果
result

代码说明

  1. lapply(the_list, function(df):遍历the_list的每个子数据框df
  2. match(the_vector, df$ids):返回每个目标基因在df$ids中的索引,不存在则返回NA
  3. !is.na(match_pos):将NA转换为FALSE,存在的位置转为TRUE,生成in_list列
  4. ifelse(is.na(match_pos), NA, df$pval[match_pos]):根据匹配位置提取p值,不存在则填充NA

运行代码后,result的结构与expected_result完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:23:17