【问题标题】:Multiple intersection of lists列表的多个交集
【发布时间】:2015-05-22 22:09:47
【问题描述】:

我有 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

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

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

【问题讨论】:

  • 您是否只想检查 commen 中是否有值,或者您是否还想知道 commen 中有哪些值?
  • @DatamineR 就是想知道有没有共同点

标签: r list set-intersection


【解决方案1】:

使用这个双重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

【讨论】:

  • 感谢您的想法。我有一个查询 - 如果d &lt;- list(8,14),那么列表b, c, d 有共同的元素。我想将输出作为列表b,c,d 或 1、2、3。那么我应该搜索矩阵并连接吗?
  • 看看替代品
  • 如果 d &lt;- list(8,14),那么第二种选择只给出 3,4 而不是 2,3,4。
  • @Dinesh 切换到&gt;=1,你会得到 2,3,4。听起来您正在描述图形的连接组件。也许像 igraph 包这样的专用工具会更好地为您服务。 mathworld.wolfram.com/ConnectedComponent.html
  • 可以简化为:sapply(l, function(x) sapply(l, function(y) length(intersect(x,y))))
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多