R中的Vlookup引用列和行

时间:2019-12-17 12:27:22

标签: r merge data.table vlookup

在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 进行比较时,我似乎错了

关于如何实现此目标的任何想法?

谢谢!

1 个答案:

答案 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