如何基于双重匹配条件将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
相关产品推荐
相关产品推荐

