R语言按分组批量新增行 自动补全dyad二元配对数据
批量补全分组双向二元关系(dyadic)数据
问题场景
现有按分组存储的二元关系格式数据集,需为每个分组新增指定国家,自动补全新增国家与组内原有国家的双向配对(即「新增国-原有国」「原有国-新增国」两类观测均需生成)。逐组手动重命名、拼接的方案在分组、待添加国家数量较多时效率极低,需可复用的自动化批量处理流程。
示例原始数据
data <- data.frame(country1 = c("BEL", "FRA", "BEL", "FRA", "AUS", "ITA"), country2 = c("FRA", "BEL", "FRA", "BEL", "ITA", "AUS"), year = c(2001,2001,2002,2002,2002,2002), id = c(1,1,1,1,2,2))
原始数据结构:
country1 country2 year id 1 BEL FRA 2001 1 2 FRA BEL 2001 1 3 BEL FRA 2002 1 4 FRA BEL 2002 1 5 AUS ITA 2002 2 6 ITA AUS 2002 2
示例需求
- id=1分组新增国家LUX(卢森堡)
- id=2分组新增国家POR(葡萄牙)
- 分组下所有年份维度均需补全新增国家与原有国家的双向配对
期望输出结构:
country1 country2 year id 1 BEL FRA 2001 1 2 FRA BEL 2001 1 3 LUX BEL 2001 1 4 LUX FRA 2001 1 5 BEL LUX 2001 1 6 FRA LUX 2001 1 7 BEL FRA 2002 1 8 FRA BEL 2002 1 9 LUX BEL 2002 1 10 LUX FRA 2002 1 11 BEL LUX 2002 1 12 FRA LUX 2002 1 13 AUS ITA 2002 2 14 ITA AUS 2002 2 15 POR AUS 2002 2 16 POR ITA 2002 2 17 AUS POR 2002 2 18 ITA POR 2002 2
批量实现方案
前置准备
首先整理分组-待添加国家映射表,将所有分组与对应要新增的国家整理为两列数据框,这是批量处理的唯一配置项,后续代码无需逐组修改。示例映射表如下:
# 实际使用时补全所有分组的对应关系即可,单个分组需添加多个国家时新增多行记录 add_map <- data.frame( id = c(1, 2), add_country = c("LUX", "POR") )
完整处理代码
基于dplyr和tidyr实现,核心逻辑为按「分组+年份」粒度提取组内原有国家,关联待添加国家后自动生成双向配对,最后与原始数据合并去重:
library(dplyr) library(tidyr) # 批量生成所有新增dyad配对 new_dyads <- data %>% # 按id+year分组,提取组内所有不重复的原有国家 group_by(id, year) %>% summarise( exist_country = unique(c(country1, country2)), .groups = "drop" ) %>% # 关联当前分组需要新增的国家 left_join(add_map, by = "id") %>% # 构造两个方向的配对 mutate( # 方向1:新增国为country1,原有国家为country2 c1_dir1 = add_country, c2_dir1 = exist_country, # 方向2:原有国家为country1,新增国为country2 c1_dir2 = exist_country, c2_dir2 = add_country ) %>% # 宽表转长表,统一列结构 select(id, year, c1_dir1, c2_dir1, c1_dir2, c2_dir2) %>% pivot_longer( cols = -c(id, year), names_to = c(".value", "dir"), names_sep = "_" ) %>% # 对齐原始数据列名,去除重复配对 select(country1 = c1, country2 = c2, year, id) %>% distinct() # 合并原始数据与新增配对,排序得到最终结果 final_data <- bind_rows(data, new_dyads) %>% arrange(id, year, country1, country2)
运行后final_data与期望输出完全一致。
场景扩展适配
- 单个分组需添加多个国家:仅需在
add_map中为对应id新增多行记录,代码无需调整 - 数据包含其他协变量:在分组汇总步骤保留对应「分组+年份」维度的协变量值,合并时同步带出即可
- 需排除自配对:最终结果增加
filter(country1 != country2)步骤即可
内容的提问来源于stack exchange,提问作者Djoustaine
相关产品推荐
相关产品推荐

