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

如何在R语言中利用多个DataFrame整理数据

数据框合并解决方案

问题说明

现有三个R数据框dat1、dat2、dat3,需要以dat3为核心,将dat1中对应ID1的Score字段,以及dat2中对应ID2的Value、Time、Age字段合并进来,匹配不到的位置用NA填充,最终得到指定结构的目标表。

原始数据代码

dat1<-read.table(text="ID1  Score
12  2
10  3
14  4
",h=T)
dat2<-read.table(text="ID2  Value   Time    Age
22  2   12  60
24  4   80  44
14  6   18  45
16  8   88  40
",h=T)
dat3<-read.table(text="ID1  ID2 Class   Color   Status
10  24  M   B   P
14  16  N   P   Q
12  14  N   P   Q
19  16  M   P   Q
",h=T)

目标结果

ID1 ID2 Class   Color   Status  Score   Value   Time    Age
10  24  M   B   P   3   4   80  44
14  16  N   P   Q   4   8   88  40
12  14  N   P   Q   2   6   18  45
19  16  M   P   Q   NA  8   88  40

实现方法

方法1:基础R原生merge()函数

分两次左连接,先关联dat3和dat1,再关联结果与dat2:

# 第一步:合并dat3与dat1,保留dat3所有行
temp_table <- merge(dat3, dat1, by = "ID1", all.x = TRUE)
# 第二步:合并临时表与dat2,同样保留主表所有行
final_table <- merge(temp_table, dat2, by = "ID2", all.x = TRUE)
# 调整列顺序,和目标表结构对齐(可选)
final_table <- final_table[, c("ID1", "ID2", "Class", "Color", "Status", "Score", "Value", "Time", "Age")]

# 查看结果
print(final_table)

方法2:dplyr包的left_join()(tidyverse风格)

用管道操作连续左连接,代码更简洁直观:

# 先加载dplyr包
library(dplyr)

final_table <- dat3 %>%
  left_join(dat1, by = "ID1") %>%  # 按ID1关联dat1的Score
  left_join(dat2, by = "ID2")     # 按ID2关联dat2的Value、Time、Age

# 查看结果
print(final_table)

两种方法都能得到符合要求的结果,其中left_join会自动保留主表(dat3)的所有行,匹配不到的字段自动填充NA,完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:39:27