R中的多个列表交集

Din*_*esh 3 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

查找重复行的索引

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

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

Dat*_*neR 6

怎么用这个双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
Run Code Online (Sandbox Code Playgroud)

解释:例如矩阵的[1,2]的元件显示了列表的第一个元素有多少个元素l(在此情况下,子表a)具有黎民与所述第二列表元素(即,子列表b)

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

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