对于所有这些数据框的所有可能组合,在多个但不是所有可用数据框中查找公共行

Find common rows across multiple, but not all available data frames, for all possible combinations of all those data frames

我有多个格式如下的数据框:

        Gene Entrez.Id                                    Dataset Correlation
1     MTHFD2     10797 CRISPR (DepMap 22Q1 Public+Score, Chronos)   0.3328479
2   SLC25A32     81034 CRISPR (DepMap 22Q1 Public+Score, Chronos)   0.3111028
3    MTHFD1L     25902 CRISPR (DepMap 22Q1 Public+Score, Chronos)   0.2710356
4       DTX3    196403 CRISPR (DepMap 22Q1 Public+Score, Chronos)   0.2672314

我的目标是在 Gene 列中找到所有数据框共有的元素,为此我使用了以下命令:

df.join <- join_all(list(df1,df2,df3,df4,df5), by = "Gene", type = "inner")

但是实际上没有Gene个所有数据框共有的元素,所以df.join是空的。 现在我想知道 Gene 列中是否有大多数数据框共有但不是全部的元素,比方说 5 个中有 4 个。有没有一种方法可以做到这一点而无需手动为所有数据构建代码行数据框的可能组合?

涉及 dplyrpurrr 的一个选项可能是:

ids_to_join <- mget(ls(pattern = "df")) %>%
    map_dfr(~ select(., "Gene"), .id = "dataset") %>%
    group_by(Gene) %>%
    summarise(n = n_distinct(dataset)) %>%
    ungroup() %>%
    filter(n == 5) %>% #The number corresponds to the required number of datasets
    pull(Gene)

mget(ls(pattern = "df")) %>%
    map(~ filter(., Gene %in% ids_to_join)) %>%
    reduce(inner_join, 
           by = "Gene")

在这种方法中,识别了所需数量的数据集(此处 n = 5)中存在的 ID。然后,在第二步中,将这些ID过滤出来并拼接在一起。

如果还需要有关数据集的信息:

ids_to_join <- mget(ls(pattern = "df")) %>%
    map_dfr(~ select(., "Gene"), .id = "dataset") %>%
    group_by(Gene) %>%
    summarise(n = n_distinct(dataset),
              dataset = paste(dataset, collapse = ", ")) %>%
    ungroup() %>%
    filter(n == 5) %>%
    select(-n)

mget(ls(pattern = "df")) %>%
    map(~ filter(., Gene %in% ids_to_join[["Gene"]])) %>%
    reduce(inner_join, 
           by = "Gene") %>%
    left_join(ids_to_join,
              by = "Gene")