更新:第一个问题已解决。 该问题是由 df2 引起的,因为 df2 不是 data.frame。
我的数据有两种棘手的情况(所有数据框都很大(。
1( DF看起来像:
ISO3 CurrencyCode OriginalPrice
USA USD 2.5
USA n/a 3.6
CAN CAD 2.8
...
DF2是一个货币代码列表看起来像
ISO3 CurrencyCode
USA USD
CAN CAD
JAP JPY
...
我试图使用 df2 在 df 中找到那些丢失的货币代码。
我尝试了以下代码,但不起作用:
setDT(df)[df2, CurrencyCode:= CurrencyCode, on = .(ISO3)]
另一个问题类似,但更为复杂。
DF看起来像:
ID PayDate CurrencyCode ISO3
1 2016/05/01 EUR FIN
2 2019/01/14 CAD CAN
...
10000 2015/07/31 USD USA
10001 2018/12/07 CAD CAN
DF2 看起来像:
StartDate EndDate CurrencyCode Rate ISO3
2015/01/01 2015/03/05 CAD 0.75 CAN
2017/05/08 2017/12/31 JPY 0.0091 JAP
....
2019/07/01 2019/08/31 JPY 0.0093 JAP
我想让 df 看起来像:
ID PayDate CurrencyCode Rate ISO3
1 2016/05/01 EUR 1.06 FIN
2 2019/01/14 CAD 0.85 CAN
...
10000 2015/07/31 USD 1 USA
10001 2018/12/07 CAD 0.75 CAN
费率由PayDate
决定.PayDate
应位于 df2 中的StartDate
和EndDate
之间。 如果来自 df2 的信息不足,则应通过PayDate
的StartDate
柜来定义速率。
这是我的代码:
setDT(df)[df2, Rate:= Rate, .(date =seq(StartDate, EndDate, by = "day")), by = .(ISO3)]
再说一遍....我有错误。
这是第一个"问题"的答案
library( data.table )
#or setDT(df);setDT(df2)
df <- fread("ISO3 CurrencyCode OriginalPrice
USA USD 2.5
USA n/a 3.6
CAN CAD 2.8")
df2 <- fread("ISO3 CurrencyCode
USA USD
CAN CAD
JAP JPY")
#update join DF by reference with the CurrencyCode from df2
df[ df2, CurrencyCode := i.CurrencyCode, on = .(ISO3) ]
# ISO3 CurrencyCode OriginalPrice
# 1: USA USD 2.5
# 2: USA USD 3.6
# 3: CAN CAD 2.8
对于第二个,非等值连接可能会起作用。但是如果没有适当的示例数据,我就无法生成代码。请提供更好的样品集,最好是导致您想要的输出的样品集