6

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

好吧,有时我没有完全匹配,在这种情况下,我想找到最近的更少日期。我的问题与这篇关于 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

先感谢您。

4

2 回答 2

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
于 2012-07-05T10:58:30.700 回答
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 本质上是无序的,因此您需要自联接和“排序依据”来完成此任务。它可以在 SQL 中完成并且可以工作,但它可能很慢并且需要更多代码。由于 SQL 是行存储,甚至是内存中的 SQL,它的下限由从 RAM 到 L2 缓存的页面提取确定。data.table低于该下限,因为它是列存储。

2 个小插曲也在主页上。

于 2012-07-05T10:28:37.657 回答