Rstudio中跨两个表使用if函数实现欧元美元金额换算为英镑的问题
R语言实现多币种金额按日期汇率换算为英镑的方案
首先先做数据预处理,你提供的示例数据中Amount和Rate字段都是字符格式,需要先转为数值型才能计算:
# 预处理消费表 DF$Amount <- as.numeric(DF$Amount) # 预处理汇率表 XR$Rate <- as.numeric(XR$Rate)
方案1:基础R实现(无需加载第三方包)
使用merge函数匹配对应日期和币种的汇率,逻辑等价于Excel的VLOOKUP,之后结合ifelse判断计算换算后金额即可:
# 按日期、币种合并两张表,保留消费表的所有行 merge_df <- merge(DF, XR, by.x = c("Date", "Currency"), by.y = c("Date", "Country"), all.x = TRUE) # 计算换算为英镑的金额,GBP直接保留原金额 merge_df$GBP_Amount <- ifelse(merge_df$Currency == "GBP", merge_df$Amount, merge_df$Amount * merge_df$Rate) # 可选:删除多余的Rate列,保留原表结构 merge_df$Rate <- NULL
运行后你提到的测试用例(2021年1月2日Person B消费150欧元)会得到150 * 6 = 900的结果,完全符合需求。
方案2:tidyverse/dplyr实现(语法更简洁)
如果常用tidyverse生态,用left_join实现匹配逻辑可读性更高:
library(dplyr) result <- DF %>% left_join(XR, by = c("Date" = "Date", "Currency" = "Country")) %>% mutate(GBP_Amount = ifelse(Currency == "GBP", Amount, Amount * Rate)) %>% select(-Rate) # 可选删除汇率列
说明:两种方案都默认你所有非GBP的币种都能在汇率表中找到对应日期的汇率,如果存在缺失汇率的情况,可以在
ifelse中补充异常值处理逻辑。如果确实需要逐行遍历的if判断逻辑,也可以用for循环或者apply系列函数实现,但数据量大时性能远低于上面的合并匹配方案,更推荐优先使用上述两种方法。
内容的提问来源于stack exchange,提问作者adjectivedave
相关产品推荐
相关产品推荐

