【问题标题】:Jumping to the next available date when merging data.frames by date按日期合并 data.frames 时跳转到下一个可用日期
【发布时间】:2014-06-12 00:37:18
【问题描述】:

我想按日期合并两个 data.frames。数据包含给定股票的每个交易日的股票数据。事件包含有关公司的新闻。一些消息是在非交易日发布的,因此当天没有股票数据。例如,在 2000 年 1 月 4 日,公司发布了一些新闻。我想将这篇文章与下一个交易日的回报合并,在这种情况下是 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")

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

输出应如下所示:

#         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

谢谢!

【问题讨论】:

  • 以我糟糕的 R 技能,我什至无法想象任何合理的可行方法..
  • 注意:使用stringsAsFactors=FALSE 创建data.frame,以便date1date2 不是连接与data.table 解决方案一起正常工作的因素。
  • @阿伦:谢谢你的帮助!现在,当我有多个公司的面板时,我该怎么办?我在这里针对小组情况发布了相同的问题:stackoverflow.com/questions/23309515/…

标签: r date merge dataframe


【解决方案1】:

这可以通过使用data.table 包的滚动连接轻松完成:

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

【讨论】:

    【解决方案2】:

    对于data.table 的不情愿的爱好者来说,这是一种冗长的不优雅的方法 #将 date1 和 date2 转换为 R 日期格式

    data$date1=as.Date(data$date1,"%d.%m.%Y")
    events$date2=as.Date(events$date2,"%d.%m.%Y")
    
    #For dates of returns which are not in events, find the closest previous date from events
    
    prev.df<-do.call(rbind,lapply(data$date1[!data$date1 %in% events$date2],function(x) { data.frame(date=x,prevd=as.numeric(max(events$date2[events$date2<x],na.rm=TRUE))) }))
    
    prev.finite<-prev.df[is.finite(prev.df$prevd),]              #remove -Inf/NA values created due to missing values
    prev.finite$prevd<-as.Date(prev.finite$prevd,origin="1970-01-01")  # convert to date format
    
    prev.nodup<-prev.finite[!duplicated(prev.finite$prevd),]   #remove duplicates
    
    events.new<-events                    #create dummy events dataset for merging
    
    events.new$date2[events.new$date2 %in% prev.nodup$prevd]<-prev.nodup$date[prev.nodup$prevd %in% events.new$date2]
    
    
    colnames(events.new)[1]<-"date1"       #change columnd name for merge with "data"
    
    events.final<-merge(events.new,data,by="date1")  #merge with common column "date1"
    > events.final                                   #final dataset
           date1   news2 ret1
    1 2000-01-02 blabla1  1.1
    2 2000-01-03 blabla2  3.0
    3 2000-01-06 blabla3  1.4
    4 2000-01-09 blabla4  0.6
    

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多