在滚动连接上按引用添加列

jan*_*cki 5 r data.table

问题标题中描述了主要问题.直接进入下面的例子.

我有两个数据集:

library(data.table)
dt1 <- data.table(date = as.Date("2015-06-28")+c(0L,3L,5L,7L),
                  key="date")
dt2 <- data.table(date = as.Date("2015-06-30")+c(0:1,4L),
                  val = letters[7:9],
                  dummy = rep(NA,3),
                  key="date")
Run Code Online (Sandbox Code Playgroud)

我希望将valdt2添加到dt1使用滚动连接.
以下语句将产生与预期的类似的输出:

dt2[dt1, roll=TRUE]
#          date val dummy
# 1: 2015-06-28  NA    NA
# 2: 2015-07-01   h    NA
# 3: 2015-07-03   h    NA
# 4: 2015-07-05   i    NA
Run Code Online (Sandbox Code Playgroud)

这个陈述有两个问题:
1.我不想要第 2 dummy
.我想通过引用来做到这一点:

address(dt1)
# [1] "0x3b57540"
address(dt2[dt1, roll=TRUE])
# [1] "0x3b4e1f0"
Run Code Online (Sandbox Code Playgroud)

所以,我在寻找轧参加并通过我引用添加列dt1dt2,预期输出:

#          date val
# 1: 2015-06-28  NA
# 2: 2015-07-01   h
# 3: 2015-07-03   h
# 4: 2015-07-05   i
Run Code Online (Sandbox Code Playgroud)

,当然address(dt1)要匹配address的的魔法声明.

Cla*_*ley 4

这是一种应该可扩展的方法。

address(dt1)
# [1] "0x265a060"
ix = dt2[dt1, roll=TRUE, which=TRUE]
dt1[, val := dt2[ix, val]]
dt1
#          date val
# 1: 2015-06-28  NA
# 2: 2015-07-01   h
# 3: 2015-07-03   h
# 4: 2015-07-05   i
address(dt1)
# [1] "0x265a060"
Run Code Online (Sandbox Code Playgroud)

或者不创建索引,直接为:

dt1[, val := dt2[dt1, val, roll = TRUE]] ## (1)
Run Code Online (Sandbox Code Playgroud)

请注意,这比执行以下操作更有效:

dt1[, val := dt2[dt1, roll = TRUE]$val] ## (2)
Run Code Online (Sandbox Code Playgroud)

(2) 执行整个连接(具体化所有列),然后提取val,其中 (1) 直接提取列val