r - 使用 data.table 在列表中查找完整集

假设我有以下列表:

org <- list(1L, c(1L,2L), 2L, c(1L,3L), c(1L,2L,3L), c(2L,3L), 3L, 4L)
str(org)
#> List of 8
#>  $ : int 1
#>  $ : int [1:2] 1 2
#>  $ : int 2
#>  $ : int [1:2] 1 3
#>  $ : int [1:3] 1 2 3
#>  $ : int [1:2] 2 3
#>  $ : int 3
#>  $ : int 4

现在我想获取完整列表中的位置。 因此在示例中,位置 1、2、3、4、6、7 都是列表中第 5 个元素的子集。 列表中的第 8 个元素不是列表中其他元素的子集。 所以,我想返回这些元素的位置。在这种情况下:5 和 8。

compl <- c(5, 8)

我可以使用 data.table 轻松实现吗?

由 reprex package 创建于 2021-04-29 (v1.0.0)

最佳答案

这是一个基本的 R 选项:

#Define a function which identifies a complete set
complete_set <- function(x, y) all(x %in% y)
#Check each set with every other set
mat <- sapply(org, function(x) sapply(org, function(y) complete_set(x, y)))
#Turn diagonals to be FALSE
diag(mat) <- FALSE
#position of sets which are not complete
which(colSums(mat) == 0)
#[1] 5 8

这基本上是一个双循环(因此如果列表太大则不是最有效的)。它将列表中的每个元素 ( x ) 与所有其他元素 ( y ) 进行比较并返回 TRUE如果第一个元素 ( x ) 完全存在于第二个元素 ( y ) 中。由于每个元素都完全独立存在,我们手动将它们转为 FALSE使用 diag(mat) <- FALSE .最后,我们只选择那些不完全存在于列表中任何元素中的元素。 (colSums(mat) == 0)。

https://stackoverflow.com/questions/67314133/

相关文章:

c - C 版本是否向后兼容?

generics - 如何使通用形式参数别名

python - For 循环得到错误说 (odd number - odd number)/2 i

r - 按组计算数据框中出现的连续月份

nlp - 如何为 T5 模型使用 forward() 方法而不是 model.generate()

python - 如何将有效值传入 cleartext_keyset_json 以创建 Tink k

Python - 用于从文本中获取特定行的正则表达式

python - Pandas pivot dataframe 并根据它们是否存在将新列设置为 Tr

rust - 如何结合 `Ord::cmp()`中的两个cmp条件

regex - 我如何在 vim 中翻译正则表达式以与 sed 一起工作?