在R中从Excel复制vlookup方面,我需要帮助。我有以下两种数据表,但还有更多行和属性。为了简单起见,我重新定义了它们-
FX <- data.table(Currency = c("USD","EUR","AUD"), Y2014 = c(2.13,3.45,1.8), Y2015 = c(2.16,3.48,1.7), Y2016 = c(2.19,3.49,1.6))
DATA <- data.table(Customer = c("Abc","Def","Ghi","Jkl","Mno"), Year = c(2013,2014,2015,2012,2018), CurrencyCode = c("AUD","USD","USD","EUR","USD"))
FX 在行中列出了货币列表,在不同年份中列出了不同年份,以列表示了它们与固定货币(SEK)的汇率,而 DATA 有一些客户交易最初以该固定货币(SEK)报告。
我想通过首先匹配中的 Currency 属性,向 DATA 添加另一个属性,例如 ConversionRate 。 FX 到 DATA 中的 CurrencyCode ,然后从 DATA 中选择在 Year 中指定的年份的相应转换率。 strong>,将其与 FX 中的 Yxxxx 列进行匹配。
这将导致类似这样的结果-
data <- data.table(Customer = c("Abc","Def","Ghi","Jkl","Mno"), Year = c(2013,2014,2015,2012,2018), ConversionRate = c(1.7,2.13,2.16,3.45,2.19))
请注意,对于2014年年,我希望它能提取2014年相应货币的汇率,对于2016年年像2016年第1、4、5行一样,选择相应货币的汇率。
我尝试使用循环,合并甚至自定义vlookup函数,但是在将 Year 与列名 Yxxxx 进行比较时,我似乎错了
关于如何实现此目标的任何想法?
谢谢!
答案 0 :(得分:3)
将FX融化为long并将“ Y2016”等值转换为数字后,您可以使用此fx_long对DATA
进行更新连接。如果要加入数据中的年份而不是年份,则可以先创建一个新列join_year
并加入。
library(data.table)
fx_long <- melt(FX, 'Currency')[, Year := as.numeric(sub('Y', '', variable))]
DATA[, join_year := pmin(pmax(Year, 2014), 2016)]
DATA[fx_long, on = .(join_year = Year, CurrencyCode = Currency), ConversionRate := i.value]
DATA
# Customer Year CurrencyCode join_year ConversionRate
# 1: Abc 2013 AUD 2014 1.80
# 2: Def 2014 USD 2014 2.13
# 3: Ghi 2015 USD 2015 2.16
# 4: Jkl 2012 EUR 2014 3.45
# 5: Mno 2018 USD 2016 2.19