从2个长度不等的列表中获取公共元素

时间:2018-07-23 07:20:22

标签: r

我的数据结构如下:

xy
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1]  2  3  4  5  6  7  8  9 10 11 12

xyz
[[1]] 
[[1]] [[1]]
[1] 3 4 5 6 7 8 9 10
[[2]]
[[2]] [[1]]
[1]  5  6  7  8  9 10 11 12 13 14 15
[[3]]
[[3]] [[1]]
[1]  6  7  8  9 10 11 12

我想找到列表的每个子集中存在的公共元素。 我的预期输出是:

New_list
[[1]]
[1] 3 4 5 6 7 8 9 10
[[2]]
[1] 5  6  7  8  9 10 11 12 
[[3]]
[1] 6  7  8  9 10 11 12

最初,我尝试了以下命令:

Map(intersect,xy,xyz)

但是,它显示以下错误:

  

警告信息:   在mapply(FUN = f,...,SIMPLIFY = FALSE)中:     较长的参数不是较短的参数的长度的倍数**

我猜想这与列表长度不相等有关,因为我的命令在等长列表上能正常工作。

2 个答案:

答案 0 :(得分:4)

我们unlist第一个list,展平第二个并在list上循环并使用intersect

lapply(do.call(c, xyz), function(x) intersect(x, unlist(xy)))
#[[1]]
#[1]  3  4  5  6  7  8  9 10

#[[2]]
#[1]  5  6  7  8  9 10 11 12

#[[3]]
#[1]  6  7  8  9 10 11 12

数据

xy <- list(1:10, 2:12)
xyz <- list(list(3:10), list(5:15), list(6:12))

答案 1 :(得分:1)

l1 <- list(1:10,2:12)

l2 <- list(list(3:10),list(5:15),list(6:12))


lapply(unlist(l2,recursive=F),function(x){intersect(unlist(l1),x)})