我正在尝试将来自一个数据框架的股票交易与当时流行的中间报价进行匹配。因此,时间戳不完全匹配,但我在交易发生时只有相应的报价时间间隔。 我写了一个循环,但是因为我知道应该尽可能避免循环,我寻找替代方案。 首先,这是我的循环:
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
所以我想从后者的相应时间知道后者的中间引用。示例中的时间是从午夜开始的几秒钟。
答案 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