问题标题中描述了主要问题.直接进入下面的例子.
我有两个数据集:
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)
我希望将val列dt2添加到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)
所以,我在寻找轧参加并通过我引用添加列dt1和dt2,预期输出:
# 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的的魔法声明.
这是一种应该可扩展的方法。
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。