R igraph获取直连节点对公共关联节点及解决ID转节点名称问题
问题解决:R igraph获取直接相连节点的共同关联节点(返回节点名称)
问题原因
你之前使用的代码返回的是igraph内部的节点数字索引,而非你设置的国家名称,只需要将索引映射到节点的name属性即可解决该问题。
完整可运行代码
library(igraph) library(dplyr) # 原始数据构造 countryA <- c("USA", "USA", "USA", "USA", "GERMANY", "GERMANY", "GERMANY", "JAPAN", "JAPAN", "CHINA", "USA", "USA", "FRANCE") countryB <- c("MEXICO", "CANADA", "GERMANY", "JAPAN", "CANADA", "JAPAN", "FRANCE", "KOREA", "CHINA", "KOREA", "KOREA", "CHINA", "CANADA") year <- rep(2000, 13) data <- data.frame(countryA, countryB, year, stringsAsFactors = FALSE) edge <- graph_from_data_frame(data, directed = FALSE) # 修改后的获取共同关联节点函数 get_mutuals <- function(g) { # 提前获取所有节点的名称,用于索引映射 node_names <- V(g)$name do.call("rbind", lapply(seq.int(1, vcount(g)-1), function(i) { do.call("rbind", lapply(seq.int(i+1, vcount(g)), function(j) { ni <- neighbors(g, i) nj <- neighbors(g, j) overlap <- intersect(ni, nj) # 仅保留直接相连的节点对 if (length(overlap) > 0 & are_adjacent(g, i, j)) { # 数字索引转节点名称 res <- data.frame( node1 = node_names[i], node2 = node_names[j], mutual = node_names[overlap] ) # 生成反向节点对,匹配你需要的双向展示格式 res_rev <- data.frame( node1 = node_names[j], node2 = node_names[i], mutual = node_names[overlap] ) return(rbind(res, res_rev)) } else { return(NULL) } })) })) } # 生成格式2的结果(每个共同节点单独占一行) res_format2 <- get_mutuals(edge) # 生成格式1的结果(同一对节点的共同节点拼接为逗号分隔字符串) res_format1 <- res_format2 %>% group_by(node1, node2) %>% summarise(mutual = paste(unique(mutual), collapse = ", "), .groups = "drop")
结果验证
查询USA和JAPAN的共同关联节点,返回GERMANY、KOREA、CHINA,和你描述的预期结果完全一致。
内容的提问来源于stack exchange,提问作者newbierrr
相关产品推荐
相关产品推荐

