Dưới đây là một cách tiếp cận dựa trên 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
Logic ở đây cũng tương tự như câu trả lời của Ronak; Tôi chỉ thấy điều này dễ đọc hơn. Nếu muốn, bạn có thể viết dòng cuối cùng là map(~unique(flatten_dbl(mylist[.x])))
hoặc chia dòng thành map(~mylist[.x]) %>% simplify_all() %>% map(unique)
.
Đối với các chỉ số trong đó yếu tố được tổng hợp mà nhóm, chỉ cần gọi which
trên các yếu tố được sử dụng để Subsetting:
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
Một logic thay thế cho toàn bộ điều là để làm cho danh sách lồng nhau thay vì các cuộc gọi, có nghĩa là tự tham gia là lên phía trước (với cross2
), không có Subsetting sau, và hầu hết các chức năng này chỉ cần thiết lập các hoạt động:
mylist %>%
map(cross2, mylist) %>%
modify_depth(2, reduce, ~if(length(intersect(.x, .y)) > 0) sort(union(.x, .y))) %>%
map(reduce, union) %>%
unique()
hoặc sử dụng cross2
's .filter
tham số,
mylist %>%
map(cross2, mylist, ~length(intersect(.x, .y)) == 0) %>%
map(compose(sort, unique, unlist)) %>%
unique()
có thể được ngưng tụ để
mylist %>%
map(function(element) sort(unique(unlist(cross2(element, mylist, ~length(intersect(.x, .y)) == 0))))) %>%
unique()
Những cách tiếp cận không thả các nhóm trùng lặp cho đến cuối cùng, mặc dù, vì vậy họ đang có khả năng kém hiệu quả.
Đây có thể là trường hợp sử dụng tốt cho gói 'igraph'. –