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

如何基于双重匹配条件将df2的Budget_spent列添加到df1中

解决DataFrame按多条件匹配添加列的问题

这里有两种简单可靠的方法来实现你要的需求:

方法一:Base R 的 merge() 函数

直接用merge按国家+年份两个条件匹配,因为两个表的对应列名不同,需要用by.x和by.y指定匹配列,再处理行顺序以保留原df1的结构:

# 执行匹配合并,all.x=TRUE确保保留df1的所有行
merged_df <- merge(df1, df2, by.x = c("Countries", "Year_of_order"), by.y = c("Names", "Year"), all.x = TRUE)
# 还原df1的原始行顺序
df1$Budget_spent <- merged_df[match(rownames(df1), rownames(merged_df)), "Budget_spent"]

方法二:tidyverse 工具包的 left_join()

用dplyr的left_join更直观,适合习惯tidy语法的场景:

library(dplyr)

df1 <- df1 %>%
  left_join(df2, by = c("Countries" = "Names", "Year_of_order" = "Year"))

两种方法都能得到你期望的输出,另外建议把df2$Budget_spent转成数值型方便后续计算:

df2$Budget_spent <- as.numeric(df2$Budget_spent)

你之前代码的问题解析

你写的循环逻辑存在多处错误:

  • R的for循环不能直接赋值给数据框列,循环本身不会返回有效结果;
  • match函数是单向量匹配,两个match结果相加无法定位同时满足国家和年份的行;
  • df2$Budget_spent是字符类型,不能直接做加法运算,这也是你报错"argument non-numeric for binary operator"的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:42:42