更新:第一个解决。该问题是由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没有足够的信息,则速率应由StartDate
到PayDate
的壁橱中定义。
这是我的代码:
setDT(df)[df2, Rate:= Rate, .(date =seq(StartDate, EndDate, by = "day")), by = .(ISO3)]
再说一次...。我出错了。
答案 0 :(得分:0)
这是第一个“问题”的答案
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
对于第二个,非等号联接可能会解决问题。但是如果没有适当的样本数据,我将无法生成代码。请提供更好的样本集,最好是一个能达到所需输出的样本集