【问题标题】:Check if a vector is a superset of another vector in R检查一个向量是否是 R 中另一个向量的超集
【发布时间】:2018-04-24 23:47:28
【问题描述】:

我有以下向量列表:

a <- c(1,2,4,5,6,7,8,9)
b <- c(1,2,4,5)
c <- c(1,2,3,10,11,12,13,14)
d <- c(1,2,3,10,15,16,17,18,19)
e <- c(1,2,3,10,15,16)
f <- list(a,b,c,d,e)

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

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

如何在 R 中做到这一点?

【问题讨论】:

  • 不是您想要的输出的第一个对象 (b) 是前一个向量 (a) 的子向量吗?根据我从你的解释中得到的,你得到了正确的答案
  • 是的。如果 (b) 是 (a) 的子向量,则输出应包含 (b) 而排除 (a)。很抱歉对此不清楚!

标签: r list vector comparison subset


【解决方案1】:

在下面的代码 sn-p 中,我使用 %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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多