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

问题描述 投票:2回答:1

例如,如果我们有图1-2-3并删除顶点2,则图形将为1-3。我有一个10000000+顶点的巨大图形,所以我无法手动删除和创建所有这些顶点。当我使用delete.vertices(g, verticesToDelete)时,它会自动删除它们与邻居的边缘。假设我们有一个stackoverflow用户和徽章的图表,其中边缘表示用户拥有该徽章。我想在拥有该徽章的所有用户之间拥有优势。以下是代码示例:

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)
r igraph
1个回答
0
投票

这个怎么样?

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)
  1. 您可以通过徽章将表edgeList与自身合并,以获得具有相同徽章的所有用户组合
  2. 删除列徽章:我们不需要它
  3. 删除用户与自己的关系
  4. 删除用户的排列:如果1和2之间有链接,我不需要2和1之间的链接(这也将解决第3点)
  5. 享受你的图表(如果这是你要求的图表......)

这是另一种选择

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)
  1. 我们会过滤具有相同徽章的用户
  2. 创建这些用户的所有集合
  3. 加入所有套装
  4. 绘制图形

它应该更“对记忆更友好”

© www.soinside.com 2019 - 2024. All rights reserved.