R语言如何将事件数据集转换为按规则赋值的两种邻接矩阵
R语言实现事件机构邻接矩阵生成方案
核心逻辑说明
先将每个事件的所有参与机构(最多3个)去重后生成两两配对,每对机构在同一事件中出现即视为一次共同参与,再基于配对数据统计两类指标,最后转换为行列均为唯一机构ID的邻接矩阵。
实现代码
前置依赖
首先加载数据处理所需包:
library(tidyverse)
步骤1:生成所有机构两两配对
org_pairs <- sample %>% rowwise() %>% mutate( # 提取当前事件所有机构,如需排除占位符0,可在末尾加 [c(org1, org2, org3) != "0"] orgs = list(unique(c(org1, org2, org3))), # 生成所有两两无序组合 pairs = list(combn(orgs, 2, simplify = FALSE)) ) %>% unnest_longer(pairs) %>% # 拆分配对的两个机构 mutate( org_a = map_chr(pairs, 1), org_b = map_chr(pairs, 2) ) %>% select(id, org_a, org_b, BP, nr_participants) %>% ungroup() # 提取所有唯一机构ID,用于补全矩阵行列 all_orgs <- sort(unique(c(sample$org1, sample$org2, sample$org3)))
步骤2:生成第一类邻接矩阵(共同参与人数总和)
# 统计每对机构的共同参与总人数 sum_cnt <- org_pairs %>% group_by(org_a, org_b) %>% summarise(total = sum(nr_participants), .groups = "drop") # 转换为邻接矩阵,无共同参与的配对值为0 adj_matrix1 <- sum_cnt %>% complete(org_a = all_orgs, org_b = all_orgs, fill = list(total = 0)) %>% pivot_wider(names_from = org_b, values_from = total) %>% column_to_rownames("org_a") %>% as.matrix() # 生成无向对称矩阵(可选,默认生成的是上三角有值的矩阵) adj_matrix1[lower.tri(adj_matrix1)] <- t(adj_matrix1)[lower.tri(adj_matrix1)] # 如需去掉自环(机构自身配对),可执行:diag(adj_matrix1) <- 0
步骤3:生成第二类邻接矩阵(BP=1事件占比)
# 统计每对机构共同参与事件中BP=1的占比 bp_ratio <- org_pairs %>% group_by(org_a, org_b) %>% summarise( total_event = n(), bp1_event = sum(BP == 1), ratio = bp1_event / total_event, .groups = "drop" ) # 转换为邻接矩阵,无共同参与的配对占比为0 adj_matrix2 <- bp_ratio %>% complete(org_a = all_orgs, org_b = all_orgs, fill = list(ratio = 0)) %>% pivot_wider(names_from = org_b, values_from = ratio) %>% column_to_rownames("org_a") %>% as.matrix() # 生成无向对称矩阵(可选) adj_matrix2[lower.tri(adj_matrix2)] <- t(adj_matrix2)[lower.tri(adj_matrix2)] # 如需去掉自环,可执行:diag(adj_matrix2) <- 0
内容的提问来源于stack exchange,提问作者Erdne Htábrob
相关产品推荐
相关产品推荐

