如何将第二个DataFrame的列匹配填充到第一个DataFrame的对应列
实现方案
以下提供两种稳定的实现方式,完全不受两个表行序差异影响:
基础R实现
通过构造组合匹配键的方式定位对应行,无需安装额外依赖:
# 构造唯一组合键(自定义分隔符避免字段内容歧义) df1_match_key <- paste(DF1$ID, DF1$Dates, sep = "|_=_|") df2_match_key <- paste(DF2$ID, DF2$Dates, sep = "|_=_|") # 匹配位置后赋值 DF1$ValueA <- DF2$ValueA[match(df1_match_key, df2_match_key)]
tidyverse实现(dplyr 1.0.0及以上版本支持)
使用专用的行更新函数,语法更易读:
library(dplyr) DF1 <- DF1 %>% rows_update( y = select(DF2, ID, Dates, ValueA), by = c("ID", "Dates") )
注意事项
- 匹配前需确认两个表的
ID和Dates字段格式完全一致:比如Dates字段不要一个为Date类型一个为字符串类型,ID字段不要一个为数值型一个为字符型,格式不一致会直接导致匹配失败。 - 如果DF2中存在同一个
ID+Dates组合对应多条记录的情况,上述方案默认会取DF2中第一条匹配记录的值,若需避免重复可以先对DF2按主键去重:
基础R去重:
dplyr去重:DF2 <- DF2[!duplicated(DF2[,c("ID", "Dates")]),]DF2 <- DF2 %>% distinct(ID, Dates, .keep_all = TRUE)
内容的提问来源于stack exchange,提问作者Jimbo Biggly
相关产品推荐
相关产品推荐

