R中的多个列表交集

时间:2015-05-22 22:09:48

标签: r list set-intersection

我有4个列表

a <- list(1,2,3,4)
b <- list(5,6,7,8)
c <- list(7,9,0)
d <- list(12,14)

我想知道哪些列表有共同的元素。在此示例中,列表bc具有共同的元素7。

蛮力方法是采用每个列表组合并找到交叉点。在R中还有其他有效的方法吗?

另一种方法是从所有列表中创建单个列表并找到重复项。那么也许我们可以有一个映射函数来指示这些重复项来自哪个原始列表。但我不确定如何做到这一点。我遇到过这篇文章

Find indices of duplicated rows

我在想是否可以修改它以找出具有重复项的实际列表。

我必须为许多列表组重复此过程。 任何建议/想法都非常感谢! 提前致谢

1 个答案:

答案 0 :(得分:5)

如何使用此双sapply

l <- list(a,b,c,d)

sapply(seq_len(length(l)), function(x) 
  sapply(seq_len(length(l)), function(y) length(intersect(unlist(l[x]), unlist(l[y])))))
     [,1] [,2] [,3] [,4]
[1,]    4    0    0    0
[2,]    0    4    1    0
[3,]    0    1    3    0
[4,]    0    0    0    2

解释:例如矩阵的元素[1,2]显示列表l的第一个元素(在本例中为子列表a)与第二个列表元素(即子列表)共有多少个元素b

或者只是为了查看与其他子列表具有共同值的子列表的索引:

which(sapply(seq_len(length(l)), function(x) length(intersect(l[[x]], unlist(l[-x])))) >= 1)
[1] 2 3