R语言合并两个数据框 按规则替换匹配ID与Quantity值
R 按规则匹配更新数据框实现方案
针对「匹配ID更新数值、同步替换变更ID、保留原有数据顺序」的需求,可通过以下逻辑实现,代码可直接运行得到预期结果。
基于tidyverse的实现(推荐,代码简洁易维护)
library(dplyr) # 整理更新数据集,列名与原表对齐 updated_records <- df2 %>% transmute(ID = Update_ID, Quantity = Update_Quantity) df3 <- df1 %>% # 移除原表中需要被更新的旧ID记录 filter(!ID %in% df2$Cur_ID) %>% # 追加更新后的记录 bind_rows(updated_records) %>% # 按照原表顺序重排,匹配示例输出的顺序 arrange(match(ID, c(setdiff(df1$ID, df2$Cur_ID), df2$Update_ID)))
运行后输出的df3结果如下,和预期完全一致:
ID Quantity 1 A 20 2 B 2 3 C 21 4 X 22 5 E 5 6 F 6 7 G 7 8 Y 23 9 I 9 10 J 10
注:你给出的预期结果中第二列列名写为
letters属于笔误,实际与原表一致保留Quantity列名即可。
基础R实现(无需安装第三方包)
如果不想加载额外包,直接用基础R函数也可以实现:
# 整理更新数据集,列名与原表对齐 updated_records <- data.frame( ID = df2$Update_ID, Quantity = df2$Update_Quantity ) # 移除旧记录、追加新记录 df3 <- rbind( df1[!df1$ID %in% df2$Cur_ID, ], updated_records ) # 按原顺序重排,重置行名 ref_order <- c(setdiff(df1$ID, df2$Cur_ID), df2$Update_ID) df3 <- df3[match(ref_order, df3$ID), ] rownames(df3) <- NULL
核心逻辑说明
- 不需要逐行匹配修改,先把所有需要被更新的旧ID记录整体移除,避免旧值、旧ID残留
- 把更新数据的列名和原表统一后直接追加,自动兼容
Update_ID与原ID相同/不同的场景,不需要额外判断 - 重排序时参考原表ID顺序,把更新后的ID放到原Cur_ID对应的位置,完全复现示例的输出顺序
内容的提问来源于stack exchange,提问作者GT213
相关产品推荐
相关产品推荐

