【问题标题】:Matching all elements in nested lists (irrespective of position) and returning matches with indexes匹配嵌套列表中的所有元素(无论位置如何)并返回匹配索引
【发布时间】:2018-12-02 12:29:24
【问题描述】:

我有两个从

创建的列表 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

和y,

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)

这不起作用....

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

  matches

        [1] False

        [1] 1 3 5 7 9

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

【问题讨论】:

  • 如果您可以为您的数据子集提供一个可重现的示例,这将有助于人们解决您的问题并阐明您的意思是“匹配可能位于不同位置的确切元素”。谢谢:)
  • 如果你想匹配xy为什么不先匹配unlist呢?还是要匹配x[[1]]y[[1]]等?

标签: r list matching nested-lists


【解决方案1】:

你可以这样做:

所以,您已经制作了列表列表,使用起来非常混乱,您完全可以避免使用c,所以您可以使用x &lt;- 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% 映射列表中的每个项目以查看元素是否存在 包含其他元素的项目,如果所有元素都存在它 将返回 TRUE 或 FALSE,在您的情况下,它将返回 FALSE 并且 分别为真。

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

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

输出:

  # [[1]]
   # [1] FALSE

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

【讨论】:

  • 感谢您的帮助和解释 :)
猜你喜欢
  • 2023-02-06
  • 1970-01-01
  • 2021-12-05
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
相关资源
最近更新 更多