从基因ID向量匹配列表子集元素并生成对应数据框列表
需求说明
我有一个包含基因ID的向量,需要识别列表中每个子数据框是否包含这些ID,并提取对应的p值。修正后的预期结果是:每个子列表对应一个数据框,包含三列:
gene_ids:目标基因IDin_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
代码说明
lapply(the_list, function(df):遍历the_list的每个子数据框dfmatch(the_vector, df$ids):返回每个目标基因在df$ids中的索引,不存在则返回NA!is.na(match_pos):将NA转换为FALSE,存在的位置转为TRUE,生成in_list列ifelse(is.na(match_pos), NA, df$pval[match_pos]):根据匹配位置提取p值,不存在则填充NA
运行代码后,result的结构与expected_result完全一致。
内容的提问来源于stack exchange,提问作者Sebastian Hesse
相关产品推荐
相关产品推荐

