यहाँ एक purrr आधारित दृष्टिकोण है:
library(purrr)
mylist <- list(7,
c(10, 11, 12, 211, 446, 469),
c(10, 11, 12, 13),
c(11, 12, 13, 215),
c(15, 16),
c(15, 17, 216, 225))
result <- mylist %>%
# check whether any numbers of an element are in any of the elements
map(~map_lgl(mylist, compose(any, `%in%`), .x)) %>%
unique() %>% # drop duplicated groups
map(~reduce(mylist[.x], union)) # subset lst by group and collapse subgroups
str(result)
#> List of 3
#> $ : num 7
#> $ : num [1:8] 10 11 12 211 446 469 13 215
#> $ : num [1:5] 15 16 17 216 225
तर्क यहां रौनक के जवाब के समान है; मुझे बस पढ़ने के लिए यह आसान लगता है। यदि आप चाहें, तो आप अंतिम पंक्ति map(~unique(flatten_dbl(mylist[.x])))
के रूप में लिख सकते हैं या इसे map(~mylist[.x]) %>% simplify_all() %>% map(unique)
में विभाजित कर सकते हैं।
सूचकांक जिनमें से तत्व है जो समूह, बस तत्वों subsetting के लिए इस्तेमाल किया पर which
कॉल करने के लिए एकत्रित किया गया है के लिए:
mylist %>%
map(~map_lgl(mylist, compose(any, `%in%`), .x)) %>%
unique() %>%
map(which) %>%
str()
#> List of 3
#> $ : int 1
#> $ : int [1:3] 2 3 4
#> $ : int [1:2] 5 6
पूरी बात के लिए एक वैकल्पिक तर्क है सूची के बजाय नेस्ट करना के लिए कॉल, स्वयं में शामिल होने का मतलब है जो सामने (cross2
के साथ) ऊपर है, वहाँ कोई subsetting बाद में है, और कार्यों का सबसे बस संचालन सेट कर रहे हैं:
mylist %>%
map(cross2, mylist) %>%
modify_depth(2, reduce, ~if(length(intersect(.x, .y)) > 0) sort(union(.x, .y))) %>%
map(reduce, union) %>%
unique()
या 0 का उपयोग करके .filter
पैरामीटर,
mylist %>%
map(cross2, mylist, ~length(intersect(.x, .y)) == 0) %>%
map(compose(sort, unique, unlist)) %>%
unique()
जो
mylist %>%
map(function(element) sort(unique(unlist(cross2(element, mylist, ~length(intersect(.x, .y)) == 0))))) %>%
unique()
को सघन किया जा सकता है इन तरीकों, हालांकि अंत तक डुप्लिकेट समूहों ड्रॉप नहीं है, इसलिए वे संभावना कम कुशल हो।
यह 'igraph' पैकेज के लिए एक अच्छा उपयोग केस हो सकता है। –