如何从图中删除顶点并在其邻居之间创建边?
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()
或屏幕截图)?您可以使用 reprex
和 datapasta
包来帮助您。另见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 之间 数据好像太大了。你能分成几个部分吗?以上是关于如何从图中删除顶点并在其邻居之间创建边?的主要内容,如果未能解决你的问题,请参考以下文章