Roll join在data.table中提供NA

时间:2017-02-09 08:24:54

标签: r data.table

示例数据:

Usage = data.table(
  feature = 'M11', 
  startDate = structure(rep(17130, 17155, c(4, 3)), class = "Date"), 
  cc = 'X6', vendor = 'Z1'
)
Limits = data.table(
  vendorId = 'Z1',
  featureId = 'M11', 
  costcenter ='X6', oldLimit = 1:6, 
  date = structure(17044 + c(91, 61, 30, 0, 105, 75), class = "Date")
)

我正在尝试通过查看limit Usagedata.table Limits添加列data.table。这是为了找出featurecostCentervendor组合在相应使用时的限制。

但是当我尝试使用下面的代码进行滚动连接时,我得到了奇怪的结果。我为我的数据获得了很多NA s,因此创建了上面的示例数据。下面是我的滚动加入代码。

Usage[Limits, limitAtStartDate:= i.oldLimit,   
      on = c(cc="costcenter", feature="featureId",
             vendor="vendorId", startDate="date" ), 
      roll=TRUE, verbose=TRUE][] 
#    feature  startDate cc vendor limitAtStartDate
# 1:     M11 2016-11-25 X6     Z1                6
# 2:     M11 2016-11-25 X6     Z1               NA
# 3:     M11 2016-11-25 X6     Z1               NA
# 4:     M11 2016-11-25 X6     Z1               NA
# 5:     M11 2016-12-20 X6     Z1                5
# 6:     M11 2016-12-20 X6     Z1               NA
# 7:     M11 2016-12-20 X6     Z1               NA

为什么5& 6仅针对limitAtStartDate的一条记录设置?

对于所有5的{​​{1}}和2016-12-20所有行,我期待6。请让我知道我哪里出错了。我使用的是2016-11-25版本data.table

1 个答案:

答案 0 :(得分:3)

X[Y]中执行data.table加入时,您基本上正在为Y中的每个值设置X中的值。Y因此,结果连接将具有Limits表的长度。在您的情况下,您尝试在Usage中为Limits中的每个值找到一个值,并获得7长度向量。因此,您可能应该以相反的方式加入,然后将其存储回Limits[Usage, oldLimit, on = .(costcenter = cc, featureId = feature, vendorId = vendor, date = startDate), roll = TRUE] ## [1] 6 6 6 6 5 5 5

findInterval

作为旁注,对于非常(有时不是这样)的简单案例,您可以使用setorder(Limits, date)[findInterval(Usage$startDate, date), oldLimit] ## [1] 6 6 6 6 5 5 5

data.table

这是一个非常有效的功能但有一些注意事项

  • 您需要先对间隔向量进行排序。
  • 您无法像在roll = 2中那样轻松设置滚动间隔(例如roll = TRUE而非data.table
  • 可能最大的缺点是,同时对多个变量执行滚动连接会很棘手(不涉及循环),就像使用case tuple:Product => { tuple.productIterator.toList match { case (head::rest) => ... } }
  • 一样容易