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)
我想检查 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...
}
}
}
本质上它是在询问列表是否包含重复的向量。谢谢你的帮助。
解决方案
一种方法是使用 double sapply
。我不确定这有多有效,因为它或多或少也是双循环,只是代码更少。
sapply(seq_along(a), function(x) any(sapply(a[-x],
function(y) all(a[[x]] %in% y))))
#[1] TRUE FALSE FALSE FALSE
它遵循与您相同的逻辑。循环遍历每个列表元素并搜索它是否是任何其他列表元素的子集。它返回逻辑向量,指示它是否是子集。
推荐阅读
- python - 如何在python中删除多个连续重复字符的连续序列
- .net-core - 在 Windows Server 上使用 Wiremock.NET 时如何防止 503?
- python - 将元素重复到新行 ElementTree
- postgresql - TimescaleDB / PostgreSQL 每日最大时区偏移量
- javascript - 访问 GUM 的 Chrome 扩展程序
- javascript - 如何将对象更改为数组以在sails.js 中创建多记录?
- c - 当存储在 CPU 寄存器中时,快速整数类型是否更快?
- javascript - Javascript 日期对象基于什么
- python - 使用公式向数据框添加一行
- validation - Oracle APEX 5.1 验证未执行