匹配嵌套列表中的所有元素(不考虑位置)并返回与索引的匹配

Matching all elements in nested lists (irrespective of position) and returning matches with indexes

我从

创建了两个列表 x 和 y
x1 = list(c(1,2,3,4))
x2 = list(c(seq(1, 10, by = 2)))
x<- list(x1,x2)

x
[[1]]
[[1]][[1]]
[1] 1 2 3 4


[[2]]
[[2]][[1]]
[1] 1 3 5 7 9

和你,

y1 = list(c(5, 6, 7, 8))
y2 = list(c(9, 7, 5, 3, 1))
y <- list(y1, y2)

y
[[1]]
[[1]][[1]]
[1] 5 6 7 8


[[2]]
[[2]][[1]]
[1] 9 7 5 3 1

所以基本上,我想将 x 匹配到 y 中,所以我应该让“1 3 5 7 9”实际上是一个匹配项。我也需要索引。

我试过了,我想匹配每个 x[[ ]] 与每个 y[[ ]] 的值,而不管位置如何。

Matches <- x[x %in% y]
IDX <- which(x %in% y)

这行不通....

我想要可以 return 匹配相同元素的东西,而不管每个列表的位置如何。这将是我需要什么的粗略想法...

  matches

        [1] False

        [1] 1 3 5 7 9

提前致谢,感谢所有帮助。

您可以执行以下操作:

因此,您制作了列表列表,使用起来非常混乱,您本可以完全避免使用 c,因此您可以 x <- c(x1, x2) 获取向量列表,这更容易使用。

但是由于您提供了列表列表,我将使用它。

现在回到解决您的问题:

flags <- lapply(Map(`%in%`, unlist(x, recursive = F), unlist(y, recursive=F)),all) 


k <- lapply(1:length(x), function(i)ifelse(unlist(flags)[i] == TRUE, 
                                          list(unlist(x, recursive=F)[[i]]), 
                                          unlist(flags[i]))) 

unlist(k, recursive = F)  #Final Output

逻辑:

  • 使用 %in% 映射列表中的每个项目以查看是否有元素 包含其他元素的项目,如果所有元素都存在 return 是 TRUE 还是 FALSE,在你的情况下它将是 return FALSE 并且 分别为真。

  • 这里我们使用 flag 作为过滤器迭代到 x 的列表 criteria 你可以制作另一个列表 k,当标志的值创建在 前面的步骤为 TRUE,它将复制回 x 的内容,但是 当 FALSE 时它将保持为 FALSE

  • 答案的最后一步,再次取消列出 k 以转换为列表 使用 unlist 和 recursive = F.

  • 的向量

输出:

  # [[1]]
   # [1] FALSE

   # [[2]]
   # [1] 1 3 5 7 9