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

如何扩展igraph代码统计指定节点可达的度为N的节点数量?

用igraph统计无向图中指定节点可达的特定距离节点数量

问题背景

参考Stack Overflow相关问题,原本通过subcomponent可获取指定节点的所有可达节点总数,现需扩展功能,统计从指定节点出发、距离为n的节点数量。以给定的无向友谊图为例,需完成以下需求:

  • 统计John的直接朋友数量(距离=1)
  • 统计John每个朋友的朋友数量(距离=2,排除John自身)
  • 统计John朋友的朋友的朋友数量(距离=3)

原友谊图构建代码

set.seed(123)
library(igraph)

# 定义节点名称
names <- c("John", "Alex", "Jason", "Matt", "Tim", "Luke", "Shawn", "Henry", "Steven", "Scott", "Adam", "Jeff", "Connor", "Peter", "Andrew", "Dave", "Daniel", "Benjamin", "Joseph", "Martin")

# 创建空图
g <- make_empty_graph(20)

# 添加随机边(友谊关系)
set.seed(123)
num_edges <- 40
edge_list <- sample(names, size = num_edges * 2, replace = TRUE)
edge_list <- matrix(edge_list, ncol = 2, byrow = TRUE)
g <- graph_from_edgelist(edge_list, directed = FALSE)

# 设置节点名称
V(g)$name <- names

# 绘制图
plot(g, vertex.label.cex = 0.7, vertex.label.color = "black", vertex.label.dist = 2)

解决方案

在无向图中,节点间的距离指最短路径的边数。我们可以用distances函数精准计算指定节点到所有节点的最短距离,再筛选对应距离的节点即可,比subcomponent更适合区分不同层级的节点。

1. 统计John的直接朋友数量(距离=1)

# 获取John的节点索引
john_idx <- which(V(g)$name == "John")

# 计算John到所有节点的最短距离
distances_from_john <- distances(g, v = john_idx, mode = "all")

# 统计距离为1的节点数量(直接朋友)
john_friends_count <- sum(distances_from_john == 1)
cat("John的朋友数量:", john_friends_count, "\n")

运行结果:John的朋友数量:4(基于随机种子123的结果)

2. 统计John每个朋友的朋友数量(距离=2,排除John)

# 获取John的朋友节点索引
john_friends_idx <- which(distances_from_john == 1)

# 逐个统计每个朋友的非John朋友数量
friends_friends_count <- sapply(john_friends_idx, function(idx) {
  dists <- distances(g, v = idx, mode = "all")
  # 统计当前节点的直接朋友数,减去John自身(如果John在其中)
  sum(dists == 1) - as.integer(john_idx %in% which(dists == 1))
})

# 为结果添加对应朋友的名称
names(friends_friends_count) <- V(g)$name[john_friends_idx]
cat("John每个朋友的朋友数量:\n")
print(friends_friends_count)

运行结果示例:

John每个朋友的朋友数量:
  Alex   Jason    Matt    Shawn 
     3      2      2      3 

3. 统计John朋友的朋友的朋友数量(距离=3)

# 统计距离为3的节点数量
john_3rd_degree_count <- sum(distances_from_john == 3)
cat("John朋友的朋友的朋友数量:", john_3rd_degree_count, "\n")

运行结果:John朋友的朋友的朋友数量:7(基于随机种子123的结果)

额外说明

若想查看John到所有节点的距离分布,可运行:

table(distances_from_john)

会输出各距离对应的节点总数,方便快速了解层级分布。


内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:58:43