[英]Find the intersection of all combination of list of list
我的最終目標是在R
中擁有沖積地塊。 但是,我的數據很大並且沒有以可用於直接輸入的方式存儲,我有:
我的想法是使用length(intersect())
來獲取向量列表的每個組合的頻率。
為了獲得列表列表的組合,我使用了purrr
中的cross()
。 我不確定這是否是獲得此組合矩陣的正確方法,並且我對其他方法持開放態度。 同樣,我對其他可以實現目標的管道持開放態度。 主要原因是我被困在這一點上,找不到找到向量列表交集的好方法。
下面是一個玩具數據集和我想要得到的預期 output(我手動輸入結果):
library(tidyverse)
group1 <- list(module1 = c("test1", "test2", "test3", "test4", "test5", "test6"),
module2 = c("test7", "test8", "test9", "test10"),
module3 = c("test11", "test12", "test13"))
group2 <- list(module1 = c("test3", "test4", "test5", "test7", "test8"),
module2 = c("test1", "test12", "test13"),
module3 = c("test2", "test6", "test11"))
group3 <- list(module1 = c("test3", "test5", "test6", "test8"),
module2 = c("test1", "test7", "test9", "test10"),
module3 = c("test13", "test14", "test15"))
list_combination <- list(group1 = names(group1), group2 = names(group2), group3 = names(group3)) %>%
cross() %>%
bind_rows()
expected_result_intersect <- list_combination %>% #below are the results
mutate(intersect_result = list(
c("test3", "test5"), #intersect(group1_module1, intersect(group2_module1, group3_module1))
c("test8"), #intersect(group1_module2, intersect(group2_module1, group3_module1))
NULL, #intersect(group1_module3, intersect(group2_module1, group3_module1))
NULL, #intersect(group1_module1, intersect(group2_module2, group3_module1))
NULL, #intersect(group1_module2, intersect(group2_module2, group3_module1))
NULL, #intersect(group1_module3, intersect(group2_module3, group3_module1))
c("test6"), #intersect(group1_module1, intersect(group2_module3, group3_module1))
NULL, #intersect(group1_module2, intersect(group2_module3, group3_module1))
NULL, #intersect(group1_module3, intersect(group2_module3, group3_module1))
c("test5"), #intersect(group1_module1, intersect(group2_module1, group3_module2))
c("test7"), #intersect(group1_module2, intersect(group2_module1, group3_module2))
NULL, #intersect(group1_module3, intersect(group2_module1, group3_module2))
c("test1"), #intersect(group1_module1, intersect(group2_module2, group3_module2))
NULL, #intersect(group1_module2, intersect(group2_module2, group3_module2))
NULL, #intersect(group1_module3, intersect(group2_module2, group3_module2))
NULL, #intersect(group1_module1, intersect(group2_module3, group3_module2))
NULL, #intersect(group1_module2, intersect(group2_module3, group3_module2))
NULL, #intersect(group1_module3, intersect(group2_module3, group3_module2))
NULL, #intersect(group1_module1, intersect(group2_module1, group3_module3))
NULL, #intersect(group1_module2, intersect(group2_module1, group3_module3))
NULL, #intersect(group1_module3, intersect(group2_module1, group3_module3))
NULL, #intersect(group1_module1, intersect(group2_module2, group3_module3))
NULL, #intersect(group1_module2, intersect(group2_module2, group3_module3))
c("test13"), #intersect(group1_module3, intersect(group2_module2, group3_module3))
NULL, #intersect(group1_module1, intersect(group2_module3, group3_module3))
NULL, #intersect(group1_module2, intersect(group2_module3, group3_module3))
NULL #intersect(group1_module3, intersect(group2_module3, group3_module3))
))
expected_result_counts <- expected_result_intersect %>%
rowwise() %>%
mutate(Freq = length(intersect_result))
library(ggalluvial)
ggplot(expected_result_counts,
aes(y = Freq, axis1 = group1, axis2 = group2)) +
geom_alluvium(aes(fill = group3), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Group1", "Group2"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("test plot")
需要注意的事項:
intersect(group1_module1, group1_module2)
因為組內的字符向量具有不同的元素。 我願意使用其他語言來處理數據,但更喜歡使用 R 到 plot 圖表,因為我更熟悉ggplot
。
謝謝!
map(cross(lst(group1, group2, group3)), ~reduce(.x, intersect))
是你要找的
my_list <- lst(group1, group2, group3)
list_combination%>%
mutate(result = map(cross(my_list),~reduce(.x,intersect)))
# A tibble: 27 × 4
group1 group2 group3 result
<chr> <chr> <chr> <list>
1 module1 module1 module1 <chr [2]>
2 module2 module1 module1 <chr [1]>
3 module3 module1 module1 <chr [0]>
4 module1 module2 module1 <chr [0]>
5 module2 module2 module1 <chr [0]>
6 module3 module2 module1 <chr [0]>
7 module1 module3 module1 <chr [1]>
8 module2 module3 module1 <chr [0]>
9 module3 module3 module1 <chr [0]>
10 module1 module1 module2 <chr [0]>
# … with 17 more rows
在基地 R 中:
apply(expand.grid(my_list),1, Reduce,f=intersect)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.