从另一个列表中查找丢失的数据(两个日期之间)

时间:2020-02-13 18:26:09

标签: r data.table

更新:第一个解决。该问题是由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中的StartDateEndDate之间。如果df2没有足够的信息,则速率应由StartDatePayDate的壁橱中定义。

这是我的代码:

setDT(df)[df2, Rate:= Rate, .(date =seq(StartDate, EndDate, by = "day")), by = .(ISO3)]

再说一次...。我出错了。

1 个答案:

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

对于第二个,非等号联接可能会解决问题。但是如果没有适当的样本数据,我将无法生成代码。请提供更好的样本集,最好是一个能达到所需输出的样本集