在确切的日期加入data.table,或者如果不是最近的小于日期的情况

时间:2012-07-05 09:33:02

标签: r data.table

我想使用日期作为加入加入两个data.table

好吧,有时我没有完全匹配,在这种情况下我想找到最近的更少日期。我的问题与关于SQL的这篇文章非常相似: SQL Join on Nearest less than date

我知道data.table语法类似于SQL,但我不能对此进行编码。什么是正确的语法?

简化示例:

Dt1 
   date      x
1/26/2010 - 10  
1/25/2010 - 9  
1/24/2010 - 9   
1/22/2010 - 7    
1/19/2010 - 11

Dt2
   date
1/26/2010   
1/23/2010   
1/20/2010  

输出

   date     x
1/26/2010 - 10  
1/23/2010 - 7 
1/20/2010 - 11

提前谢谢。

2 个答案:

答案 0 :(得分:6)

你走了:

library(data.table)

创建数据:

Dt1 <- read.table(text="
date      x
1/26/2010,  10  
1/25/2010,  9  
1/24/2010,  9   
1/22/2010,  7    
1/19/2010,  11", header=TRUE, stringsAsFactors=FALSE)

Dt2 <- read.table(text="
date
1/26/2010   
1/23/2010   
1/20/2010", header=TRUE, stringsAsFactors=FALSE)

转换为data.table,将字符串转换为日期,然后设置data.table键:

Dt1 <- data.table(Dt1)
Dt2 <- data.table(Dt2)

Dt1[, date:=as.Date(date, format=("%m/%d/%Y"))]
Dt2[, date:=as.Date(date, format=("%m/%d/%Y"))]

setkey(Dt1, date)
setkey(Dt2, date)

使用roll=TRUE

加入表格
Dt1[Dt2, roll=TRUE]

           date  x
[1,] 2010-01-20 11
[2,] 2010-01-23  7
[3,] 2010-01-26 10

答案 1 :(得分:2)

?data.table                  # search for the `roll` argument
example(data.table)          # search for the example using roll=TRUE
vignette("datatable-intro")  # see section "3: Fast time series join" 
vignette("datatable-faq")    # see FAQs 2.16 and 2.20

这是data.table的主要特征之一。由于行是有序的(与SQL不同),因此操作简单且非常快。 SQL本身就是无序的,所以你需要一个自我连接和'order by'来完成这个任务。它可以在SQL中完成,但它可以工作,但速度很慢,需要更多代码。由于SQL是一个行存储,即使是内存中的SQL,它的下限也是由从RAM到L2缓存的页面提取决定的。 data.table低于该下限,因为它是一个列存储。

2个小插曲也在homepage上。