【发布时间】:2019-08-01 05:34:12
【问题描述】:
考虑这个简单的例子
library(dplyr)
library(lubridate)
library(data.table)
masterdf <- data.table(time = c(ymd('2019-02-01'),
ymd('2019-02-01'),
ymd('2019-03-01')),
var = c(1,2,3))
masterdf[, mykey := time]
setkey(masterdf, 'mykey')
> masterdf
time var mykey
1: 2019-02-01 1 2019-02-01
2: 2019-02-01 2 2019-02-01
3: 2019-03-01 3 2019-03-01
和
slavedf <- data.table(timeref = c(ymd('2019-01-01'),
ymd('2019-01-28'),
ymd('2019-01-29')))
slavedf[, mykey := timeref]
setkey(slavedf, 'mykey')
> slavedf
timeref mykey
1: 2019-01-01 2019-01-01
2: 2019-01-28 2019-01-28
3: 2019-01-29 2019-01-29
我想要实现的是一个经典的滚动连接问题。对于masterdf 中的每个日期,slavedf 中最近的前一个日期是什么?
使用以下语法会返回令人费解的结果:
> #rolling join
> masterdf[slavedf, roll = - Inf]
time var mykey timeref
1: 2019-02-01 1 2019-01-01 2019-01-01
2: 2019-02-01 1 2019-01-28 2019-01-28
3: 2019-02-01 1 2019-01-29 2019-01-29
如您所见,人们会期望来自masterdf 的两个2019-02-01 日期与来自slavedf 的相同(最接近的)2019-01-29 日期匹配,并且来自masterdf 的2019-03-01 将被匹配2019-01-29 也一样。
在这里你可以看到情况并非如此,2019-03-01 甚至没有出现在输出中......我认为来自重复的键。知道该怎么做吗?
谢谢!
【问题讨论】:
-
我会尝试
slavedf[masterdf, roll = T]。它给出了Jan-29,尽管这是最接近的
标签: r data.table lubridate