如何查看列表中的哪个元素(长度为 x)包含在该列表的哪个其他元素(长度为 x+1)中?

How to see which element (of length x) in a list is contained in which other element (of length x+1) of that list?

假设我有以下列表:

unlist(mapply(combn, list(1:3), seq_along(1:3), simplify = FALSE), recursive = FALSE)

现在,我想知道列表中每个长度为 x 的元素,其中包含其他长度为 x+1 的元素。最好是 returns 一个数据框,其中第一列给出一个元素的索引,第二列给出包含它的其他元素的索引。

对于上面的例子,它需要给我:

tibble::tribble(
  ~a, ~b,
  1,  4,
  1,  5,
  2,  4,
  2,  6,
  3,  5,
  3,  6,
  4,  7,
  5,  7,
  6,  7
)

您可以使用双 sapply 来比较列表中的每对向量。这将 return 一个逻辑方阵。如果您随后使用 arr.ind = TRUE 调用 which 并排除对角线,您将获得所需的数据框。

这是一个完整的代表:

mylist <- unlist(mapply(combn, list(1:3), seq_along(1:3), simplify = FALSE), 
                 recursive = FALSE)

mat <- which(t(sapply(mylist, function(x) sapply(mylist, function(y) {
  all(x %in% y) & length(y) == length(x) + 1
  }))), arr.ind = TRUE)

setNames(as.data.frame(mat), c("a", "b"))[order(mat[,1]),]
#>   a b
#> 1 1 4
#> 3 1 5
#> 2 2 4
#> 5 2 6
#> 4 3 5
#> 6 3 6
#> 7 4 7
#> 8 5 7
#> 9 6 7