R语言如何按匹配键对两个数据框的同名指定列逐行相乘
R数据框按联合主键匹配后同名列乘积计算方案
你考虑用左连接实现的思路完全可行,核心逻辑是连接时为两个来源的同名字段加后缀区分,匹配完成后直接对同名字段做向量乘法,最后清理中间列即可。
方法1:dplyr实现(代码简洁易读,最常用)
加载dplyr包后按左连接逻辑处理:
library(dplyr) newDataframe <- dataframe1 %>% # 按Period、Code联合主键做左连接,保留dataframe1全部行 left_join(dataframe2, by = c("Period", "Code"), suffix = c("_df1", "_df2")) %>% # 计算两表匹配行的a、c列乘积 mutate( a = a_df1 * a_df2, c = c_df1 * c_df2 ) %>% # 移除连接生成的中间列,保留目标字段 select(Period, Code, a, c)
运行后得到的结果完全匹配需求:
| Period | Code | a | c |
|---|---|---|---|
| 2014-01-13 | ABC | 0.1 | 1.6 |
| 2015-01-13 | ABC | 1.0 | 8.1 |
| 2015-01-13 | LMZ | 1.2 | 2.0 |
| 2016-01-13 | LMZ | 1.2 | 4.4 |
方法2:base R实现(无需安装第三方包)
不依赖外部拓展包的原生实现代码如下:
# 以dataframe1为基准做左连接合并 merge_res <- merge( x = dataframe1, y = dataframe2, by = c("Period", "Code"), all.x = TRUE, suffixes = c("_df1", "_df2") ) # 计算列乘积 merge_res$a <- merge_res$a_df1 * merge_res$a_df2 merge_res$c <- merge_res$c_df1 * merge_res$c_df2 # 筛选保留最终需要的字段 newDataframe <- merge_res[, c("Period", "Code", "a", "c")]
注意事项
如果dataframe1中存在主键无法在dataframe2中匹配的行,对应a、c列的计算结果会返回
NA,可根据业务需要在乘法计算后对NA值做替换,比如填充0或者其他默认值。
内容的提问来源于stack exchange,提问作者KikiZ
相关产品推荐
相关产品推荐

