检查向量是否是R中另一个向量的超集

时间:2017-11-12 02:45:07

标签: r list vector comparison subset

我有以下矢量列表:

is_subset <- vector()
for(i in 1:length(f)) {
  is_subset <- c(is_subset, all(unlist(f[i]) %in% unlist(f[-i])))
}
f[!is_subset]

现在,我可以做这样的事情

[[1]]
[1] 1 2 4 5 6 7 8 9

[[2]]
[1]  1  2  3 10 11 12 13 14

[[3]]
[1]  1  2  3 10 15 16 17 18 19

并获取一个列表,其中包含的每个向量都不是原始列表中任何其他向量的子集:

[[1]]
[1] 1 2 4 5

[[2]]
[1]  1  2  3 10 11 12 13 14

[[3]]
[1]  1  2  3 10 15 16

但是,我真正想要的是对列表进行子集化,使其仅包含那些不是列表中其他向量的超集的向量 - 即,所需的输出应如下所示:

{{1}}

我怎样才能在R?

中这样做

1 个答案:

答案 0 :(得分:1)

在下面的代码段中,我使用%in%将列表中的每个向量与其他每个向量进行比较。如果每个比较向量的总和不止一次地出现非零,则向量是另一个向量的超集。请注意,我们希望单个比较完全匹配,即向量与自身的比较。

out <- sapply(f, function(x) {
    res <- lapply(f, function(y) {
        return(sum(!(y %in% x)))
    })
    return(sum(res > 0) == length(res) - 1)
})

f[out]
[[1]]
[1] 1 2 4 5

[[2]]
[1]  1  2  3 10 11 12 13 14

[[3]]
[1]  1  2  3 10 15 16

Demo