如何基于日期匹配另一数据框列值,实现多列乘法运算?
解决R数据框按日期+货币匹配计算乘积的问题
我来帮你搞定这个需求!首先得先把你的两个数据框正确创建出来(原代码里的格式有点小问题,我帮你修正了,这样你可以直接复制运行):
# 创建test数据框 test <- read.table(text = "var1 var2 var3 var4 1 12/12/2017 CAD 10 2 20/02/2018 CAD 30 3 14/03/2016 USD 44 4 10/05/2000 KOR 56 5 04/04/2016 GBP 45", header = TRUE) # 创建test2数据框 test2 <- read.table(text = "date USD CAD KOR GBP 12/12/2017 1 2 0.1 2 20/02/2018 2 1 0.8 1 14/03/2016 3 4 1.0 4 10/05/2000 4 5 0.6 5 04/04/2016 5 1 1.0 1", header = TRUE)
你的核心需求是:根据test里的日期(var2)和货币类型(var3),匹配test2中对应日期的货币汇率,然后用这个汇率去乘test里的数值(这里看数据应该是var4,因为var3是货币代码)。下面给你两种实用的实现方法:
方法一:使用tidyverse工具包(推荐,代码更直观易读)
tidyverse里的dplyr和tidyr能轻松搞定这种宽转长+匹配计算的需求:
# 先加载tidyverse包(如果没安装先运行install.packages("tidyverse")) library(tidyverse) # 把test2从宽格式转成长格式,方便和test匹配 test2_long <- test2 %>% pivot_longer( cols = -date, # 除了date列之外的所有列都要转 names_to = "currency", # 原列名(货币代码)作为新列currency的值 values_to = "exchange_rate" # 原单元格的值作为汇率列 ) # 合并两个数据框,然后计算乘积 result <- test %>% left_join( test2_long, by = c("var2" = "date", "var3" = "currency") # 按日期和货币匹配 ) %>% mutate( var4_adjusted = var4 * exchange_rate # 计算调整后的数值 ) # 查看结果 print(result)
运行后你会得到包含原数据、汇率和乘积结果的新数据框,一目了然。
方法二:使用Base R原生函数(无需额外安装包)
如果你不想加载第三方包,用Base R的reshape和merge函数也能实现:
# 把test2转成长格式 test2_long <- reshape( test2, varying = colnames(test2)[-1], # 指定要转换的列(除了date) v.names = "exchange_rate", # 汇率列的名称 timevar = "currency", # 货币列的名称 times = colnames(test2)[-1], # 货币代码的取值 direction = "long" # 转换为长格式 ) # 去掉自动生成的id列,保留需要的字段 test2_long <- test2_long[, c("date", "currency", "exchange_rate")] # 合并test和转换后的test2 merged_data <- merge( test, test2_long, by.x = c("var2", "var3"), # test里的匹配列 by.y = c("date", "currency") # test2_long里的匹配列 ) # 计算乘积 merged_data$var4_adjusted <- merged_data$var4 * merged_data$exchange_rate # 查看结果 print(merged_data)
这两种方法都能完美实现你的需求,选你用着顺手的就行~
内容的提问来源于stack exchange,提问作者Maylo
相关产品推荐
相关产品推荐

