R data.table,非等于连接列选择

时间:2018-01-30 16:27:09

标签: r data.table

我有两个数据表。一个保存时间序列数据,一个保存感兴趣的时间范围。

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

那么如何才能让dt1dt2中的所有列都回来,dateFrom中的dateTodt2未更改为使用datedt1? (假设两个数据表都有许多不能手动输入的列。所以使用colnames(dt1)会很棒)

0 个答案:

没有答案