匹配嵌套列表中的所有元素(不考虑位置)并返回与索引的匹配
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
我从
创建了两个列表 x 和 yx1 = 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