如何从图中删除顶点并在其邻居之间创建边?

Posted

技术标签:

【中文标题】如何从图中删除顶点并在其邻居之间创建边?【英文标题】:How do I delete a vertex from a graph and create edges between its neighbors? 【发布时间】:2019-03-12 04:47:50 【问题描述】:

例如,如果我们有一个图 1-2-3 并删除顶点 2,那么图将是 1-3。我有一个包含 10000000 多个顶点的巨大图表,所以我无法手动删除和创建所有顶点。当我使用delete.vertices(g, verticesToDelete) 时,它会自动删除他们与邻居之间的边缘。 假设我们有一个 *** 用户和徽章的图表,其中一条边表示用户拥有该徽章。我希望在拥有该徽章的所有用户之间拥有优势。下面是一个代码示例:

users <- c(1,2,3,4,5,6,7,8)
badges <- c('Teacher','Teacher','Teacher','Student','Student','Student','Popular Question','Popular Question')
edgeList <- data.frame(users,badges)

library(igraph)
g <- graph_from_data_frame(edgeList,directed = FALSE)
plot(g)
verticesToDelete <- c('Teacher','Student','Popular Question')
g2 <- delete.vertices(g, verticesToDelete)
plot(g2)

# I want the graph to be like the one below after the deletions

users1 <- c(1,1,2,4,4,5,7)
users2 <- c(2,3,3,5,6,6,8)
edgeList2 <- data.frame(users1,users2)
g3 <- graph_from_data_frame(edgeList2,directed = FALSE)
plot(g3)

【问题讨论】:

欢迎来到 Stack Overflow!您能否通过分享您的数据样本来重现您的问题,以便其他人可以提供帮助(请不要使用str()head() 或屏幕截图)?您可以使用 reprexdatapasta 包来帮助您。另见Help me Help you & How to make a great R reproducible example? @Tung 我添加了我的数据样本和一些代码。 我知道的老问题,但是你能?connect他们一起吗?还是用一个非常大的图表失败? 【参考方案1】:

这个怎么样?

edgeList <- data.frame(users,badges)

edgeList_badges <- merge(edgeList,edgeList,by="badges",
                         all=T)

edgeList_badges$badges <- NULL
edgeList_badges <-edgeList_badges %>% filter(users.x!=users.y)

edgeList_badges<-edgeList_badges[!duplicated(t(apply(edgeList_badges[1:2], 1, sort))), ]


g4 <- graph_from_data_frame(edgeList_badges,directed = FALSE)
plot(g4)
    您通过徽章将表edgeList 与其自身合并以获得具有相同徽章的用户的所有组合 删除列徽章:我们不需要它 删除用户与自己的关系 删除用户排列:如果 1 和 2 之间有链接,我不需要 2 和 1 之间的链接(这也解决了第 3 点) 享受您的图表(如果这是您要求的图表...)

这是另一种选择

library(DescTools)
edgeList <- data.frame(users,badges)

combSetTmp <- list()
for(badge in 1:length(verticesToDelete))
  tmp <- edgeList %>% filter(badges==verticesToDelete[badge]) %>% select(users)
  combSetTmp[[badge]] <- CombSet(tmp$users,2)



combSet <- do.call(rbind, combSetTmp)

g4 <- graph_from_edgelist(combSet,directed = FALSE)
plot(g4)
    我们过滤具有相同徽章的用户 创建这些用户的所有集合 加入所有集合 画图

应该更“内存友好”

【讨论】:

它适用于这个小样本,但原始数据帧有数百万行,合并后的数据帧将超过 2^31 -1 行,因此它返回合并错误。link 我的第二个猜测怎么样? 我收到以下错误:inds_combine(.vars, ind_list) 中的错误:位置必须在 0 和 n 之间 数据好像太大了。你能分成几个部分吗?

以上是关于如何从图中删除顶点并在其邻居之间创建边?的主要内容,如果未能解决你的问题,请参考以下文章

最小顶点覆盖

在两个顶点之间的无向图中查找特定边

如何使用 gremlin 在两个顶点之间创建双向边?

图的割点算法图的割边算法

如何根据 igraph 中顶点的邻居属性创建顶点属性?

删除一些边缘后的 DFS