首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求出所有观测组合的集合之间的交点

求出所有观测组合的集合之间的交点
EN

Stack Overflow用户
提问于 2017-05-12 19:35:05
回答 1查看 74关注 0票数 3

我有一个像这样的数据集

代码语言:javascript
运行
复制
   target.id source.id connected
          1      1     0
          2      1     0
          3      1     0
          4      1     0
          5      1     0
          6      1     0
          1      2     1
          2      2     0
          3      2     1

基本上,我有一个源位置,目的地位置,以及它们是否连接。这里的连接是定向的,例如,位置1可以连接到位置8,而位置8不能连接到位置1(想想航空公司的航班,亚特兰蒂斯号可以向火星发射飞行,而火星可能不会将飞行发送到亚特兰蒂斯,这意味着亚特兰蒂斯与火星相连,而火星不与亚特兰蒂斯连接)。

我需要找出一组“完全”连接的地点,在那里所有的观测都是彼此的来源和目标。我需要做成对,3乘3,并达到什么是可行的,因为我有75个地点。例如,对于3乘3,位置3、5和8是彼此的源和目标。

我试图解决这个问题的方法是,得到1:length(unique(target.id))的所有排列,2乘2,3乘3,直到8乘8 (8乘8是我所看到的最大集合),然后所有的排列都是intersect

不过,很明显,这是太慢了。有更好的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-12 20:42:45

听起来,您需要有向图中大小为2到8的所有集群,其中节点是您的in,当源->目标被标记为在数据集中连接时,节点是存在的。第一步是对连接的边缘进行过滤,生成类似于以下示例数据的内容:

代码语言:javascript
运行
复制
(filtered <- data.frame(source.id = c(1, 1, 2, 2, 3, 3, 3, 4, 4), target.id = c(2, 3, 1, 3, 1, 2, 4, 3, 5), connected = 1))
#   source.id target.id connected
# 1         1         2         1
# 2         1         3         1
# 3         2         1         1
# 4         2         3         1
# 5         3         1         1
# 6         3         2         1
# 7         3         4         1
# 8         4         3         1
# 9         4         5         1

接下来,您可以将数据限制为两个方向连接的id对:

代码语言:javascript
运行
复制
(bidir <- filtered[duplicated(paste(pmin(filtered$source.id, filtered$target.id),
                                    pmax(filtered$source.id, filtered$target.id))),])
#   source.id target.id connected
# 3         2         1         1
# 5         3         1         1
# 6         3         2         1
# 8         4         3         1

在这个样本数据中,大小2的团是(1,2),(1,3),(2,3)和(3,4),而大小3的团是(1,2,3)。igraph包在“接近最佳的时间”中计算这些参数:

代码语言:javascript
运行
复制
library(igraph)
g <- graph.data.frame(bidir, directed=FALSE)
cliques(g, min=2, max=8)
# [[1]]
# + 2/4 vertices, named:
# [1] 2 3
# 
# [[2]]
# + 2/4 vertices, named:
# [1] 2 1
# 
# [[3]]
# + 2/4 vertices, named:
# [1] 3 4
# 
# [[4]]
# + 2/4 vertices, named:
# [1] 3 1
# 
# [[5]]
# + 3/4 vertices, named:
# [1] 2 3 1
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43945252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档