我有以下向量列表:
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中做到这一点?
在下面的代码段中,我使用来将列表中的每个向量与其他所有向量进行比较%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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句