首页 > 解决方案 > 尽可能快地检查一组向量是否包含彼此的任何子集

问题描述

我的代码有效,但我使用的是嵌套的 for 循环,这不是最好的方法。有没有更快的方法来检查向量列表是否包含其他向量的子集?例如,我有一个名为“a”的向量列表,其中包含任意数量的向量:

a = list()
a[[1]] = c(1, 2)
a[[2]] = c(2, 3, 5)
a[[3]] = c(1, 2, 4, 6)
a[[4]] = c(9, 4)

我想检查 a[[n]] 是否是列表中任何其他向量的子集。因此,在我的示例中,只有 a[[1]] 是 a[[3]] 的子集,这是我的代码。

for (i in 1:length(a)) {
  for (j in 1:length(a)) {
    if(all(a[[i]] %in% a[[j]]) && i != j) {
        #do stuff...
    }
  }
}

本质上它是在询问列表是否包含重复的向量。谢谢你的帮助。

标签: rvectorduplicatessubset

解决方案


一种方法是使用 double sapply。我不确定这有多有效,因为它或多或少也是双循环,只是代码更少。

sapply(seq_along(a), function(x) any(sapply(a[-x], 
                                    function(y) all(a[[x]] %in% y))))

#[1]  TRUE FALSE FALSE FALSE

它遵循与您相同的逻辑。循环遍历每个列表元素并搜索它是否是任何其他列表元素的子集。它返回逻辑向量,指示它是否是子集。


推荐阅读