如何基于数值变量条件创建二部图投影(含多配对需求)
自定义二分图投影实现带条件的城市间网络构建
要实现带差值条件的城市间网络,igraph自带的bipartite_projection无法满足自定义连接规则,因此我们手动处理配对逻辑,步骤如下:
- 按个体分组,生成该个体所有访问记录的无序两两配对(包含同一城市的多次访问组合)
- 筛选配对中两个记录的
important_variable差值≤0.5的组合 - 整理边列表并构建igraph网络
示例代码
1. 加载依赖包
library(dplyr) library(tidyr) library(igraph)
2. 构造示例数据集
包含同一访客多次访问同一城市的场景:
df <- tibble( source = c("A", "A", "A", "B", "B", "B"), target = c("北京", "北京", "上海", "广州", "深圳", "深圳"), important_variable = c(1.2, 1.5, 1.6, 2.0, 2.4, 2.6) )
3. 生成符合条件的城市配对边列表
# 按个体分组,生成所有无序两两配对并筛选条件 edges_df <- df %>% group_by(source) %>% mutate(row_id = row_number()) %>% # 给每个访问记录加唯一标识,避免重复配对 crossing(., .name_repair = ~c("source", "target1", "iv1", "row_id1", "source2", "target2", "iv2", "row_id2")) %>% filter(row_id1 < row_id2) %>% # 保留无序对,避免重复边(如北京-上海和上海-北京) mutate(diff_iv = abs(iv1 - iv2)) %>% filter(diff_iv <= 0.5) %>% # 筛选差值条件 select( city1 = target1, city2 = target2, iv_city1 = iv1, iv_city2 = iv2, iv_diff = diff_iv, visitor = source ) %>% ungroup() # 构建无向igraph网络 city_network <- graph_from_data_frame(edges_df, directed = FALSE)
预期输出
边列表结果
# A tibble: 5 × 6 city1 city2 iv_city1 iv_city2 iv_diff visitor <chr> <chr> <dbl> <dbl> <dbl> <chr> 1 北京 北京 1.2 1.5 0.3 A 2 北京 上海 1.2 1.6 0.4 A 3 北京 上海 1.5 1.6 0.1 A 4 广州 深圳 2.0 2.4 0.4 B 5 深圳 深圳 2.4 2.6 0.2 B
网络属性说明
- 节点为所有出现的城市:北京、上海、广州、深圳
- 每条边包含以下属性:
iv_city1/iv_city2:配对双方的important_variable值iv_diff:两者的差值visitor:生成该边的访客ID
如果需要合并同一城市对的多条边(如北京-上海的两条边),可添加聚合逻辑,例如:
edges_aggregated <- edges_df %>% group_by(city1, city2) %>% summarize( avg_iv_diff = mean(iv_diff), visitors = paste(unique(visitor), collapse = ","), .groups = "drop" )
内容的提问来源于stack exchange,提问作者markrt
相关产品推荐
相关产品推荐

