我有两个数据表。一个保存时间序列数据,一个保存感兴趣的时间范围。
dt1 = data.table(date = seq(as.Date('2000-01-01'), length.out = 4, by = 1), B = c(1,2,3,4), C = c(10, 20, 30, 40))
dt1
date B C
1: 2000-01-01 1 10
2: 2000-01-02 2 20
3: 2000-01-03 3 30
4: 2000-01-04 4 40
dt2 = data.table(dateFrom = as.Date('2000-01-02'), dateTo = as.Date('2000-01-03'), id = 4, name='first')
dt2
dateFrom dateTo id name
1: 2000-01-02 2000-01-03 4 first
现在我在2列上进行非等同连接,没有返回列的规范。我没有" date"列,但有dateFrom和dateTo。 dateFrom和dateTo中的值更改为" date"
dt2[dt1, on = .(dateFrom <= date, dateTo >= date), nomatch = 0]
dateFrom dateTo id name B C
1: 2000-01-02 2000-01-02 4 first 2 20
2: 2000-01-03 2000-01-03 4 first 3 30
我可以通过明确要求获取日期列
dt2[dt1, on = .(dateFrom <= date, dateTo >= date), nomatch = 0, .(date)]
date
1: 2000-01-02
2: 2000-01-03
但我无法明确要求dateFrom
!即使我没有指定列
dateFrom
dt2[dt1, on = .(dateFrom <= date, dateTo >= date), nomatch = 0, .(date, dateFrom)]
Error in `[.data.table`(dt2, dt1, on = .(dateFrom <= date, dateTo >= date), :
column(s) not found: dateFrom
奇怪的是,如果非等同连接仅在一列
,则不会出错dt2[dt1, on = .(dateFrom <= date), .(date, dateFrom)]
date dateFrom
1: 2000-01-01 2000-01-01
2: 2000-01-02 2000-01-02
3: 2000-01-03 2000-01-03
4: 2000-01-04 2000-01-04
那么如何才能让dt1
和dt2
中的所有列都回来,dateFrom
中的dateTo
和dt2
未更改为使用date
在dt1
? (假设两个数据表都有许多不能手动输入的列。所以使用colnames(dt1)
会很棒)