将固定点与数据帧中的间隔匹配

时间:2013-12-15 09:32:28

标签: r dataframe match

我正在尝试将来自一个数据框架的股票交易与当时流行的中间报价进行匹配。因此,时间戳不完全匹配,但我在交易发生时只有相应的报价时间间隔。 我写了一个循环,但是因为我知道应该尽可能避免循环,我寻找替代方案。 首先,这是我的循环:

t=dim(x1)[1]
z=1  
for (i in 1:t) {  
 flag=FALSE  
 while(flag==FALSE){  
  if(x1[z,1]>x2[i,1]){    
   x2[i,2]=x1[z-1,2]  
   flag=TRUE  
   }  
  else {  
  z=z+1         
  }  
 }  
}  

我在Stack Overflow上找到了关于合并两个数组的建议,所以我将间隔的上限添加为另一列,并将相应的时间与subset-function匹配。 不幸的是,这种方法比循环花费的时间要多得多。我认为这是由于合并创建的巨大数组。带引号的数据框具有500,000个观察值和交易数据100.000。 是否有更优雅(尤其是更快)的方法来解决这个问题? 此外,对于某些数据,我收到错误消息“缺少需要TRUE / FALSE的值”,即使我手动执行if条件也是如此。

编辑:
我的报价数据如下所示:

        Time   midquote

    [1,] 35551   50.85229  
    [2,] 35589   53.77627  
    [3,] 36347   54.27945  
    [4,] 37460   52.01283  
    [5,] 37739   53.65414  
    [6,] 38249   52.34947    
    [7,] 38426   50.59568  
    [8,] 39858   53.75646  
    [9,] 40219   51.38876  
   [10,] 40915   52.09319  

和我的交易数据:

         Time   midquote
   [1,] 36429        0  
   [2,] 38966        0  
   [3,] 39334        0  
   [4,] 39998        0  
   [5,] 40831        0  

所以我想从后者的相应时间知道后者的中间引用。示例中的时间是从午夜开始的几秒钟。

1 个答案:

答案 0 :(得分:0)

对于您的示例数据集,以下方法更快:

x2[ , 2] <- x1[vapply(x2[, 1], function(x) which(x <= x1[, 1])[1] - 1L, 
                      FUN.VALUE = integer(1)), 2]

#       Time midquote
# [1,] 36429 54.27945
# [2,] 38966 50.59568
# [3,] 39334 50.59568
# [4,] 39998 53.75646
# [5,] 40831 51.38876

第二种方法:

o <- order(c(x1[ , 1], x2[ , 1]))
tmp <- c(x1[ , 2], x2[ , 2])[o]
idx <- which(!tmp)
x2[ , 2] <- tmp[unlist(tapply(idx, c(0, cumsum(diff(idx) > 1)), 
                              function(x) x - seq_along(x)), use.names = FALSE)]

#       Time midquote
# [1,] 36429 54.27945
# [2,] 38966 50.59568
# [3,] 39334 50.59568
# [4,] 39998 53.75646
# [5,] 40831 51.38876