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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:39:14