【问题标题】:data.table rolling join within range范围内的data.table滚动连接
【发布时间】:2015-09-17 15:59:09
【问题描述】:

使用 R 3.2.2,data.table 1.9.5

价格数据按如下所示的间隔提供。请注意,范围可能不连续,如记录 3 和 4 所示。

   id price    startdt      enddt
1: aa   259 2005-01-01 2005-06-30
2: aa   259 2005-07-01 2005-12-31
3: aa   249 2006-01-01 2006-06-30
4: aa   239 2007-01-01 2007-06-30

销售数据的格式如下。

   id         dt sls
1: aa 2005-03-01 250
2: aa 2005-08-15 240
3: aa 2005-12-31 300
4: aa 2006-08-01 100
5: aa 2007-04-01 400

我想创建下表。

   id         dt sls price
1: aa 2005-03-01 250   259
2: aa 2005-08-15 240   259
3: aa 2005-12-31 300   259
4: aa 2006-08-01 100    NA   <== since there isn't a price in the price table for this date
5: aa 2007-04-01 400   239

有人可以说明如何做到这一点吗?我假设我需要melt 价格表,以便日期在 1 列中,然后与销售数据进行滚动连接。完整的表有超过 2500 万条记录,用于约 70 万个 sku。

price.dt <- data.table(id=rep("aa",4),price=c(259,259,249,239),
    startdt=as.Date(c("2005-1-1","2005-7-1","2006-1-1","2007-1-1"),"%Y-%m-%d"),
    enddt=as.Date(c("2005-6-30","2005-12-31","2006-6-30","2007-6-30"),"%Y-%m-%d"))

sales.dt <- data.table(id=rep("aa",5),
    dt=as.Date(c("2005-3-1","2005-8-15","2005-12-31","2006-8-1","2007-4-1"),"%Y-%m-%d"),
    sls=c(250,240,300,100,400))

final.dt <- data.table(id=rep("aa",5),
    dt=as.Date(c("2005-3-1","2005-8-15","2005-12-31","2006-8-1","2007-4-1"),"%Y-%m-%d"),
    sls=c(250,240,300,100,400), price=c(259,259,259,NA,239))

【问题讨论】:

    标签: r data.table


    【解决方案1】:
    price.dt[sales.dt, on = c(id = 'id', startdt = 'dt'), roll = T
           ][enddt < startdt, price := NA][]
    #   id price    startdt      enddt sls
    #1: aa   259 2005-03-01 2005-06-30 250
    #2: aa   259 2005-08-15 2005-12-31 240
    #3: aa   259 2005-12-31 2005-12-31 300
    #4: aa    NA 2006-08-01 2006-06-30 100
    #5: aa   239 2007-04-01 2007-06-30 400
    

    然后您可以删除多余的列,重命名startdt 等等。另一种选择是使用foverlaps

    【讨论】:

    • 谢谢。如果可能的话,您能否也发布foverlaps 方法的代码。我没有看到如何匹配 id,以及其中一个表没有范围这一事实。
    • @ironv 您在price.dt 中添加与dt 相同的另一列,然后将这两列用于重叠连接。如果这不起作用,我建议您先自己玩玩,然后再回到 SO。
    • 知道了。我没有意识到 by.x 和 by.y。 id 包含在其中。截至目前,by 不允许重复列名。因此,需要像您建议的那样添加 tmp 列。再次感谢。
    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 2012-08-15
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多