在R语言中移除节点后恢复顶点原始名称的实现方法
解决方案
直接在代码里维护自定义顶点ID和原始国家名的映射关系,再合并到结果数据框即可,以下是修改后的完整可运行代码:
library(igraph) # 可复现示例数据 ws <- structure(list(Reporter.Countries = c("Estonia", "Estonia", "Latvia", "Uruguay", "Mexico", "Russian Federation", "Lithuania", "China, mainland", "Lithuania", "Russian Federation"), Partner.Countries = c("Algeria", "Angola", "Algeria", "Algeria", "Algeria", "Afghanistan", "Algeria", "Afghanistan", "Angola", "Albania"), Value = c(27150.02, 29001.82, 57940, 31498.1, 298765.27, 42, 48250, 2564, 41255.03, 143249.35 )), row.names = c(NA, 10L), class = "data.frame") # 创建有向图对象 g <- graph.data.frame(ws, directed=TRUE) # 给顶点添加自定义ID(v1、v2...),避免和igraph默认的原始名称属性混淆 V(g)$custom_id <- paste0("v", 1:length(V(g))) testbet <- function(g){ n <- length(V(g)) # 直接整合自定义ID、原始国家名、介数到初始数据框 mat <- data.frame( custom_id = V(g)$custom_id, original_country = V(g)$name, # 这里直接取igraph默认存储的原始顶点名(国家名) betweenness = betweenness(g), stringsAsFactors = FALSE ) # 按介数降序排序 matri <- mat[order(mat$betweenness, decreasing = TRUE),] g2 <- g clustersizes <- integer(n-1) # 循环删除顶点并记录最大聚类大小 for(i in 1:(n-1)){ g2 <- delete.vertices(g2, v=which(V(g2)$custom_id==matri$custom_id[i])) maxcsize2 <- max(clusters(g2)$csize) clustersizes[i] <- maxcsize2 } # 追加聚类大小列,最后一行补NA matri$maxcsize <- c(clustersizes, NA) # 重命名列以匹配需求 names(matri) <- c("vertex_removed", "original_country_name", "betweenness", "maxcsize") return(matri) } # 生成包含原始国家名的结果数据框 df <- testbet(g)
关键改动说明
- 将自定义顶点ID的属性名改为
custom_id,避免和igraph默认的name属性(存储原始国家名)冲突 - 在函数内直接调用
V(g)$name获取原始顶点名称,无需额外导出countrycodes数据框 - 全程用数据框替代矩阵操作,更便于后续列的追加和合并
内容的提问来源于stack exchange,提问作者MoonS
相关产品推荐
相关产品推荐

