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

在R中如何合并两个结构不同的Data Frame以得到指定结果?

R语言合并不同结构数据框并按规则提取值的实现方法

先还原你提到的两个数据框示例,方便直接运行测试:

# 创建Data Frame 1
df1 <- data.frame(
  GID_2 = c("MEX.15.1_1", "MEX.15.1_2", "MEX.15.1_3", "MEX.15.1_4", "MEX.15.1_5", "MEX.15.1_6")
)

# 创建Data Frame 2
df2 <- data.frame(
  ID_MUNICIPIO = 1:6,
  B = c(500, NA, NA, NA, NA, 700),
  C = c(NA, 300, 600, NA, NA, NA),
  D = c(NA, NA, NA, 700, 800, NA)
)

以下提供两种适合新手理解的实现方法:

方法一:提取ID后用条件判断赋值

  1. 从GID_2中提取末尾数字,作为和df2匹配的ID_MUNICIPIO:
# 先安装dplyr包:install.packages("dplyr")
library(dplyr)

df1 <- df1 %>%
  mutate(ID_MUNICIPIO = as.integer(sub(".*_", "", GID_2))) # 提取下划线后的数字并转为整数
  1. 按规则用case_when给X列赋值,最后保留目标列:
df_result <- df1 %>%
  left_join(df2, by = "ID_MUNICIPIO") %>%
  mutate(
    X = case_when(
      ID_MUNICIPIO == 1 ~ B,
      ID_MUNICIPIO == 2 ~ C,
      ID_MUNICIPIO == 3 ~ C,
      ID_MUNICIPIO == 4 ~ D,
      ID_MUNICIPIO == 5 ~ D,
      ID_MUNICIPIO == 6 ~ B
    )
  ) %>%
  select(GID_2, X)

方法二:整理df2为长格式后匹配(规则变动时更灵活)

  1. 将df2转为长格式,保留有效数值:
df2_long <- df2 %>%
  pivot_longer(cols = c(B, C, D), names_to = "col", values_to = "X") %>%
  filter(!is.na(X))
  1. 创建规则映射表,指定每个ID对应的列:
rule_map <- data.frame(
  ID_MUNICIPIO = 1:6,
  col = c("B", "C", "C", "D", "D", "B")
)
  1. 合并所有数据并提取目标列:
df_result <- df1 %>%
  mutate(ID_MUNICIPIO = as.integer(sub(".*_", "", GID_2))) %>%
  left_join(rule_map, by = "ID_MUNICIPIO") %>%
  left_join(df2_long, by = c("ID_MUNICIPIO", "col")) %>%
  select(GID_2, X)

运行任意一种方法后,df_result就是你需要的包含GID_2和X列的数据框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:46:06