按日期合并data.frames时跳到下一个可用日期 [英] Jumping to the next available date when merging data.frames by date
本文介绍了按日期合并data.frames时跳到下一个可用日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
date1< - c(01.01.2000, 02.01.2000,03.01.2000,06.01.2000,07.01.2000,09.01.2000)
ret1 <-C(-2.0,1.1,3,1.4,-0.2 ,0.6)
data< - data.frame(date1,ret1)
data
#date1 ret1
#1 01.01.2000 -2.0
#2 02.01.2000 1.1
#3 03.01.2000 3.0
#4 06.01.2000 1.4
#5 07.01.2000 -0.2
#6 09.01.2000 0.6
date2< - c(02.01.2000,03.01.2000,04.01.2000,08.01.2000)
news2< - c( blabla1,blabla2,blabla3,blabla4)
事件< - data.frame(date2,news2)
事件
#date2 news2
#1 02.01.2000 blabla1
#2 03.01.2000 blabla2
#3 04.01.2000 blabla3
#4 08.01.2000 blabla4
输出应如下所示:
#date news ret
#1 02.01.2000 blabla1 1.1
#2 03.01.2000 blabla2 3.0
#3 06.01.2000 blabla3 1.4
#4 09.01.2000 blabla4 0.6
谢谢! p>
解决方案
使用 data.table可以轻松完成滚动连接 / code> package:
require(data.table)## 1.9.2
setDT(data)##转换为data.table参考
setDT(events)## ,,
setkey(data,date1)##设置列加入,也通过'date1'排序
setkey(events,date2)## ,,还可以通过'date2'进行排序
data [,date = = date1] ##创建一个额外的列
#现在滚动加入
data [events,roll = -Inf]
#date1 ret1 date news2
#1:02.01.2000 1.1 02.01.2000 blabla1
#2:03.01.2000 3.0 03.01.2000 blabla2
#3:04.01.2000 1.4 06.01.2000 blabla3
#4:08.01.2000 0.6 09.01.2000 blabla4
I want to merge two data.frames by date. Data contains stock data for each trading day of a given stock. Events contains news about the company. Some news were published on non-trading days, so there are no stock data for this day. For example on 04.01.2000 some news for the company got published. I want to merge this article with the return of the NEXT trading day, in this case the return on the 06.01.2000. So how can I jump to the next trading day when merging?
date1 <- c("01.01.2000","02.01.2000","03.01.2000","06.01.2000","07.01.2000","09.01.2000")
ret1 <- c(-2.0,1.1,3,1.4,-0.2, 0.6)
data <- data.frame(date1, ret1)
data
# date1 ret1
# 1 01.01.2000 -2.0
# 2 02.01.2000 1.1
# 3 03.01.2000 3.0
# 4 06.01.2000 1.4
# 5 07.01.2000 -0.2
# 6 09.01.2000 0.6
date2 <- c("02.01.2000","03.01.2000","04.01.2000","08.01.2000")
news2 <- c("blabla1", "blabla2","blabla3","blabla4")
events <- data.frame(date2, news2)
events
# date2 news2
# 1 02.01.2000 blabla1
# 2 03.01.2000 blabla2
# 3 04.01.2000 blabla3
# 4 08.01.2000 blabla4
the output should look like this:
# date news ret
# 1 02.01.2000 blabla1 1.1
# 2 03.01.2000 blabla2 3.0
# 3 06.01.2000 blabla3 1.4
# 4 09.01.2000 blabla4 0.6
Thank you!
解决方案
This can be done quite easily with rolling joins using data.table
package:
require(data.table) ## 1.9.2
setDT(data) ## convert to data.table by reference
setDT(events) ## ,,
setkey(data, date1) ## set the column to join on, also sorts by 'date1'
setkey(events, date2) ## ,, also sorts by 'date2'
data[, date := date1] ## create an extra column
# Now roll join
data[events, roll=-Inf]
# date1 ret1 date news2
# 1: 02.01.2000 1.1 02.01.2000 blabla1
# 2: 03.01.2000 3.0 03.01.2000 blabla2
# 3: 04.01.2000 1.4 06.01.2000 blabla3
# 4: 08.01.2000 0.6 09.01.2000 blabla4
这篇关于按日期合并data.frames时跳到下一个可用日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文