按日期合并data.frames时跳到下一个可用日期 [英] Jumping to the next available date when merging data.frames by date

查看:111
本文介绍了按日期合并data.frames时跳到下一个可用日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想按日期合并两个data.frames。数据包含给定股票的每个交易日的股票数据。活动包含有关该公司的消息。有些消息在非交易日发布,所以目前没有股票数据。例如04.01.2000公司发布了一些消息。我想把这篇文章与NEXT交易日的回报合并,在这种情况下是06.01.2000的回报。那么我怎么可以跳到合并的下一个交易日?

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆