R语言多数据框取交集后如何按存在条件筛选目标基因
多数据框基因存在情况筛选方案
核心思路是先把列表里的数据框合并成长表,再转换成每个基因一行、每个数据框一列的宽表,用布尔值标记基因在对应数据框是否存在,之后直接按列的布尔组合做筛选即可,能覆盖所有你需要的场景,比之前用min/max判断的方法灵活度高很多,不管有多少个数据框都能用。
测试数据
library(tidyverse) df1 = data.frame(genes = c('gene1', 'gene3', 'gene4', 'gene2','gene11')) df2 = data.frame(genes = c('gene3', 'gene2', 'gene5', 'gene1', "genet",'gene11')) df3 = data.frame(genes = c('gene6', 'gene3', 'gene4', 'gdene7','gene11', 'genex', "gene10")) dfList <- list(df1, df2, df3)
第一步:预处理生成基因存在标记表
先把长表转成宽表,用TRUE标记基因存在,FALSE标记不存在,替代原来的数字/NA值,后续判断逻辑更清晰:
gene_presence <- dfList %>% bind_rows(.id="df") %>% mutate(is_present = TRUE) %>% pivot_wider( names_from = df, names_prefix = "df", values_from = is_present, values_fill = FALSE )
处理完的表结构如下,每一行对应一个基因,三列df1/df2/df3直接标记存在状态:
# A tibble: 11 × 4 genes df1 df2 df3 <chr> <lgl> <lgl> <lgl> 1 gene1 TRUE TRUE FALSE 2 gene3 TRUE TRUE TRUE 3 gene4 TRUE FALSE TRUE 4 gene2 TRUE TRUE FALSE 5 gene11 TRUE TRUE TRUE 6 gene5 FALSE TRUE FALSE 7 genet FALSE TRUE FALSE 8 gene6 FALSE FALSE TRUE 9 gdene7 FALSE FALSE TRUE 10 genex FALSE FALSE TRUE 11 gene10 FALSE FALSE TRUE
各场景筛选代码
筛选同时存在于三个数据框的基因
直接判断三列均为TRUE即可:gene_presence %>% filter(df1, df2, df3) %>% pull(genes)运行结果:
[1] "gene3" "gene11"筛选存在于指定两个数据框的基因(以仅存在于df1、df2为例)
判断目标两个数据框标记为TRUE,其余数据框标记为FALSE:gene_presence %>% filter(df1, df2, !df3) %>% pull(genes)运行结果:
[1] "gene1" "gene2"
如果不需要排除第三个数据框,只要基因同时在df1和df2存在即可,不管是否在df3出现,直接去掉!df3的判断条件就行。筛选仅存在于单个指定数据框的基因(以仅存在于df2为例)
判断目标数据框标记为TRUE,其余所有数据框标记为FALSE:gene_presence %>% filter(!df1, df2, !df3) %>% pull(genes)运行结果:
[1] "gene5" "genet"
你之前用min/max方法筛选仅在df3存在的基因,用这个逻辑写就是filter(!df1, !df2, df3),跑出来的结果和你之前得到的gdene7、gene10、gene6、genex完全一致。
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

