这是我之前问的一个问题,我几乎有堆栈社区提供的解决方案
我的虚拟数据框架
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
,df2
或df3
中。我的问题是根据不同列/条件
中的存在和不存在来找到基因。下面的代码建议做我想做的事情。
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
。我如何识别基因,例如:
- 在所有三帧中都存在?
- 出现在两个指定的帧中,例如
df1
和df2
- 只出现在一帧中,比如
df2
?
任何帮助或建议都将非常感谢
这里有几个选项
- 您可以修改您的
pivot_longer()
调用,包括value_fn
参数来制作逻辑向量,然后使用rowwise()
,并使用any
或all
。例如,如果您想获得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"
- 但是,您不需要这些中间步骤。相反,您可以使用下面这个称为
find_genes()
的灵活函数,它接受函数f
(如intersect
、union
或setdiff
)和任意数量的dfs,并根据所请求的set-function 返回跨这些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"