r-检查一组向量是否尽可能快地包含彼此的任何子集



我的代码可以工作,但我使用的是嵌套的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)

我想检查[[n]]是否是列表中任何其他向量的子集。所以在我的例子中,只有[[1]]是[[3]]的子集。这是我迄今为止的代码。

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

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

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

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

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

最新更新