我有2个数据集,每个数据集包含POSIXlt格式的日期时间值,以及一些其他数字和字符变量。
我想结合基于日期时间列的两个数据集。但是两个数据集的日期戳不匹配,因此我需要按最近的日期(之前或之后)组合它们。在我的示例中,2016-03-01 23:52:00的数据值“ e”需要与2016-03-02 00:00:00的“ binH”组合,而不是“ binG”。
是否有一个函数可以让我按最近的日期时间值组合数据集,即使是在日期之后也可以?
我已经找到了使用cut()函数或data.tables中的roll = Inf函数将日期组合到下一个以前的日期的方法。但是我无法将时间戳记设置为roll ='nearest'可以接受的任何格式。
>df1
date1 value
1 2016-03-01 17:52:00 a
2 2016-03-01 18:01:30 b
3 2016-03-01 18:05:00 c
4 2016-03-01 20:42:30 d
5 2016-03-01 23:52:00 e
>df2
date2 bin_name
1 2016-03-01 17:00:00 binA
2 2016-03-01 18:00:00 binB
3 2016-03-01 19:00:00 binC
4 2016-03-01 20:00:00 binD
5 2016-03-01 21:00:00 binE
6 2016-03-01 22:00:00 binF
7 2016-03-01 23:00:00 binG
8 2016-03-02 00:00:00 binH
9 2016-03-02 01:00:00 binI
Run Code Online (Sandbox Code Playgroud)
data.table应该可以解决此问题(您能解释遇到的错误吗?),尽管它确实倾向于将POSIXlt自己转换为POSIXct(也许在datetime列上手动进行了这种转换以保持data.table快乐)。另外,在使用之前,请确保已设置键列roll。
(我在这里创建了自己的示例表,使我的生活更轻松一些。如果您想在自己的示例上使用dput,我很高兴用您的数据更新此示例):
new <- data.table( date = as.POSIXct( c( "2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00" ) ), data.new = c( "t","u","v" ) )
head( new, 2 )
date data.new
1: 2016-03-02 12:20:00 t
2: 2016-03-07 12:20:00 u
old <- data.table( date = as.POSIXct( c( "2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00", "2015-03-02 12:20:00" ) ), data.old = c( "a","b","c","d" ) )
head( old, 2 )
date data.old
1: 2016-03-02 12:20:00 a
2: 2016-03-07 12:20:00 b
setkey( new, date )
setkey( old, date )
combined <- new[ old, roll = "nearest" ]
combined
date data.new data.old
1: 2015-03-02 12:20:00 t d
2: 2016-03-02 12:20:00 t a
3: 2016-03-07 12:20:00 u b
4: 2016-04-02 12:20:00 v c
Run Code Online (Sandbox Code Playgroud)
为了显示滚动联接如何处理多个匹配项,我有意使两个表的行长不同。您可以切换其加入方式:
combined <- old[ new, roll = "nearest" ]
combined
date data.old data.new
1: 2016-03-02 12:20:00 a t
2: 2016-03-07 12:20:00 b u
3: 2016-04-02 12:20:00 c v
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3368 次 |
| 最近记录: |