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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:57:21