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

mat*_*mat 5 r data.table

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

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

我知道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  
Run Code Online (Sandbox Code Playgroud)

产量

   date     x
1/26/2010 - 10  
1/23/2010 - 7 
1/20/2010 - 11
Run Code Online (Sandbox Code Playgroud)

先感谢您.

And*_*rie 6

干得好:

library(data.table)
Run Code Online (Sandbox Code Playgroud)

创建数据:

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)
Run Code Online (Sandbox Code Playgroud)

转换为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)
Run Code Online (Sandbox Code Playgroud)

加入表格,使用roll=TRUE:

Dt1[Dt2, roll=TRUE]

           date  x
[1,] 2010-01-20 11
[2,] 2010-01-23  7
[3,] 2010-01-26 10
Run Code Online (Sandbox Code Playgroud)

  • @mat我很高兴这个答案对你有所帮助.供将来参考:如果您在问题中提供可重现的代码,它会有很大帮助 - 这会鼓励人们回答,因为这意味着我们不必像现在这样从头开始重新创建问题.此外,如果您发布了包含错误消息的代码,我们可以解释为什么会出现错误消息以及您应该如何修复它. (3认同)