0

假设我有以下列表:

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

现在,我想知道列表中每个长度为 x 的元素,其中包含长度为 x+1 的其他元素。优选地,它返回一个数据帧,其中第一列给出一个元素的索引,第二列给出包含它的其他元素的索引。

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

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

1 回答 1

0

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

这是一个完整的代表:

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
于 2020-11-20T17:52:34.803 回答