根据时段条件按日期合并数据

时间:2019-04-05 13:57:24

标签: r

(这是对最初发布的here的质疑。

我原来的问题已经解决,但是我也想以稍微不同的方式合并这两个数据集。

df1是某种“财务报告”数据,而df2是某种“年终财务数据”。以前,我想将财务报告数据链接到最新的可用财务数据。

现在,我想使用财务报告(df2)中的数据“预测”财务数据(df1)。即通过IDdate_fdate链接数据。

我想施加以下条件:

加入;

来自{{1}的

datet+1)>来自df2的{​​{1}}(date_f),并且相差必须超过6个月,

否则;

tdf1。 (即,如果datet+2)在datet+1)之后不到6个月,则在{{{1} }。

基本上,我想使用财务报告数据date_f来预测t中的数据,但是date中的信息对于将来1周的预测没有用,因此我希望预测未来几年的数据。

数据如下:

df1:

t+2

df2:

df1

使用df2的前5行的预期输出:

df1
  • 这里的 ID date_f 1 1047699 2014-03-03 2 858339 2007-03-01 3 1002910 2009-12-22 4 277135 2011-02-18 5 753308 2004-03-09 6 1018840 2008-02-26 7 1510295 2011-10-21 8 3133 2014-02-27 9 1467858 2010-02-26 10 865436 2004-11-05 应该是 ID date year 1 3133 1999-12-31 1999 2 3133 2000-12-31 2000 3 3133 2001-12-31 2001 4 3133 2002-12-31 2002 5 3133 2003-12-31 2003 6 3133 2004-12-31 2004 中的df1,它仍然> ID date_f date year 1 1047699 2014-03-03 2 858339 2007-03-01 2007-12-31 2007 3 1002910 2009-12-22 2010-12-31 2010 * 4 277135 2011-02-18 2011-12-31 2011 5 753308 2004-03-09 2004-12-31 2004 (在1周前),但是我要施加的条件是“它必须>> date,而2009-12-31必须在未来6个月(或180天)内。因此,在第二种情况下(由于相差仅1周),此观察失败了,所以我希望“预测”下一年的日期df2

data1

date_f

data2

date_f

1 个答案:

答案 0 :(得分:0)

我认为这解决了我的问题:

df1$start_date <- df1$date_f + 183
df1$end_date <- df1$date_f + 540

library(fuzzyjoin)
yy <- fuzzy_left_join(
  df1, df2,
  by = c(
    "ID" = "ID",
    "start_date" = "date",
    "end_date" = "date"
  ),
  match_fun = list(`==`, `<`, `>=`)
)

如果有人发现我的逻辑可能失败,请纠正我!

如果3月发布财务报告而7月发布财务信息,我想忽略此联接。因此,start_date <- df1$date_f + 183。我还将上限设置为自财务报告发布之日起1.5年(540天)。因此,接下来的年度报告将正确地与正确的财务信息保持一致。

输出示例:

     ID.x     date_f    start_date end_date   ID.y      date     fyear
1  1006835  2008-09-30 2009-04-01 2010-03-24      NA       <NA>    NA
2  1510295  2009-10-19 2010-04-20 2011-04-12 1510295 2010-12-31  2010
3  1506307  2016-02-08 2016-08-09 2017-08-01 1506307 2016-12-31  2016
4   814453  2005-03-15 2005-09-14 2006-09-06  814453 2005-12-31  2005
5   832988  2003-06-19 2003-12-19 2004-12-10  832988 2004-01-31  2003
6  1275283  2007-02-26 2007-08-28 2008-08-19 1275283 2007-12-31  2007
7   858470  2004-03-15 2004-09-14 2005-09-06  858470 2004-12-31  2004
8   885639  2005-03-14 2005-09-13 2006-09-05  885639 2006-01-31  2005
9   732718  2014-04-02 2014-10-02 2015-09-24      NA       <NA>    NA
10 1385157  2009-03-02 2009-09-01 2010-08-24 1385157 2009-09-30  2009

ID.x = 1510295的{​​{1}} = date.f,如果加入2009-10-19,可能会给我year处的财务信息,该信息仅为2报告后的几个月……(对我来说不是很有用)

我创建2009-12-31 = start_date2010-04-20 = end_date的边界。 2011-04-12现在大于start_date年终财务信息2009的地方。

使用2009-12-31fuzzyjoin中的datedf2中的边界进行匹配(我想),我能够加入它们。

df1

如果某人具有###############################################################################版本,那将是很好的选择,因为此方法存在内存问题。

data.table

没有按预期工作...