如何将行元素映射到列做交集后?

  • 本文关键字:元素 映射 r
  • 更新时间 :
  • 英文 :


这是我之前问的一个问题,我几乎有堆栈社区提供的解决方案

我的虚拟数据框架

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) 

为了查看我的一组基因是否存在于每个数据框中,我运行了这个

dfList %>% 
bind_rows(.id="df") %>% 
pivot_wider(names_from=df, names_prefix="df", values_from=df) 

就得到了这样的结果

genes   df1 df2 df3
<chr>   <chr>   <chr>   <chr>
gene1   1   2   NA
gene3   1   2   3
gene4   1   NA  3
gene2   1   2   NA
gene11  1   2   3
gene5   NA  2   NA
genet   NA  2   NA
gene6   NA  NA  3
gdene7  NA  NA  3
genex   NA  NA  3
gene10  NA  NA  3

在上面的数据框中,我可以看到每个基因,无论该基因是否在df1,df2df3中。我的问题是根据不同列/条件

中的存在和不存在来找到基因。下面的代码建议做我想做的事情。

dfList %>% 
bind_rows(.id="df") %>% 
group_by(genes) %>% 
summarise(minDF=min(df), maxDF=max(df)) %>% 
filter(minDF == maxDF & maxDF == 3) %>% 
pull(genes)
'gdene7''gene10''gene6''genex'

它识别的基因,在这个例子中,只存在于df3。我如何识别基因,例如:

  • 在所有三帧中都存在?
  • 出现在两个指定的帧中,例如df1df2
  • 只出现在一帧中,比如df2?

任何帮助或建议都将非常感谢

这里有几个选项

  1. 您可以修改您的pivot_longer()调用,包括value_fn参数来制作逻辑向量,然后使用rowwise(),并使用anyall。例如,如果您想获得df1、df2和df3中的基因,您可以这样做:
dfList %>% 
bind_rows(.id="df") %>% 
pivot_wider(names_from=df, names_prefix="df", values_from=df,values_fn = (x) !is.na(x)) %>% 
rowwise() %>% 
filter(all(df1,df2,df3)) %>% 
pull(genes)
[1] "gene3"  "gene11"

如果你把filter(all())改为filter(all(df1,df2)),这将给你df1和df2的基因,而不考虑df3

[1] "gene1"  "gene3"  "gene2"  "gene11"
  1. 但是,您不需要这些中间步骤。相反,您可以使用下面这个称为find_genes()的灵活函数,它接受函数f(如intersectunionsetdiff)和任意数量的dfs,并根据所请求的set-function
  2. 返回跨这些dfs的基因集。
find_genes <- function(f,...) {
Reduce(f,c(...))
}

现在,如果你只想知道df3的基因,而不想知道其他基因,这样做:

find_genes(setdiff,df3,df2,df1)

输出:

[1] "gene6"  "gdene7" "genex"  "gene10"

如果你想知道在df1和df2中都存在的基因,将intersect传递给find_genes()函数,如下所示:

find_genes(intersect, df1,df2)

输出:

[1] "gene1"  "gene3"  "gene2"  "gene11"

如果你想知道所有三个帧中都存在的基因,传递所有三个帧

find_genes(intersect, df3, df2, df1)

输出:

[1] "gene3"  "gene11"

如果你想在两个帧中合并基因,传递union:

find_genes(union, df1, df3)

输出:

"gene1"  "gene3"  "gene4"  "gene2"  "gene11" "gene6"  "gdene7" "genex"  "gene10"

最新更新