如何在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
相关产品推荐
相关产品推荐

