列表的多个交集
Multiple intersection of lists
我有 4 个列表
a <- list(1,2,3,4)
b <- list(5,6,7,8)
c <- list(7,9,0)
d <- list(12,14)
我想知道哪些列表有共同的元素。在此示例中,列表 b
和 c
具有共同的元素 7。
一种蛮力方法是采用列表的每个组合并找到交集。在 R 中还有其他有效的方法吗?
另一种方法是从所有列表中创建一个列表并找到重复项。那么也许我们可以有一个映射函数来指示这些重复项来自哪个原始列表。但是我不太确定如何去做。我遇到了这个 post
Find indices of duplicated rows
我在想我们是否可以修改它以找出具有重复项的实际列表。
我必须对多组列表重复此过程。
非常感谢任何suggestions/ideas!
提前致谢
使用这个双 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
我有 4 个列表
a <- list(1,2,3,4)
b <- list(5,6,7,8)
c <- list(7,9,0)
d <- list(12,14)
我想知道哪些列表有共同的元素。在此示例中,列表 b
和 c
具有共同的元素 7。
一种蛮力方法是采用列表的每个组合并找到交集。在 R 中还有其他有效的方法吗?
另一种方法是从所有列表中创建一个列表并找到重复项。那么也许我们可以有一个映射函数来指示这些重复项来自哪个原始列表。但是我不太确定如何去做。我遇到了这个 post
Find indices of duplicated rows
我在想我们是否可以修改它以找出具有重复项的实际列表。
我必须对多组列表重复此过程。 非常感谢任何suggestions/ideas! 提前致谢
使用这个双 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