对于所有这些数据框的所有可能组合,在多个但不是所有可用数据框中查找公共行
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 个。有没有一种方法可以做到这一点而无需手动为所有数据构建代码行数据框的可能组合?
涉及 dplyr
和 purrr
的一个选项可能是:
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")
我有多个格式如下的数据框:
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 个。有没有一种方法可以做到这一点而无需手动为所有数据构建代码行数据框的可能组合?
涉及 dplyr
和 purrr
的一个选项可能是:
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")