簡體   English   中英

求list的list的所有組合的交集

[英]Find the intersection of all combination of list of list

我的最終目標是在R中擁有沖積地塊。 但是,我的數據很大並且沒有以可用於直接輸入的方式存儲,我有:

  1. 4 組(它們將是沖積地塊的軸)
  2. 在這些組中的每一個都包含一個向量列表的列表

我的想法是使用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)因為組內的字符向量具有不同的元素。
  • 在真實數據集中,我每組有超過 50 個模塊。 因此,如果所提出的方法具有計算/RAM 效率,那就太好了。

我願意使用其他語言來處理數據,但更喜歡使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM