示例数据:
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
Usage
向data.table
Limits
添加列data.table
。这是为了找出feature
,costCenter
,vendor
组合在相应使用时的限制。
但是当我尝试使用下面的代码进行滚动连接时,我得到了奇怪的结果。我为我的数据获得了很多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
。
答案 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) => ...
}
}