You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:57:03