我想使用日期作为加入加入两个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
提前谢谢。
答案 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上。