R 将固定点与数据帧中的间隔相匹配
我试图将一个数据框中的股票交易与当时流行的中间报价进行匹配。因此,时间戳并不完全匹配,但我只有交易发生时相应的报价时间间隔。 我写了一个可行的循环,但因为我知道应该尽可能避免循环,所以我寻找了一个替代方案。 首先,这是我的循环: 我发现了关于堆栈溢出的建议,建议合并两个数组,因此我添加了间隔的上限作为另一列,并用subset函数匹配相应的时间。 不幸的是,这种方法比循环花费的时间多得多。我想这是由于合并产生的巨大数组。带引号的数据框有500.000个观察值,事务数据有100.000个。 有没有更优雅(尤其是更快)的方法来解决这个问题? 此外,对于某些数据,我会收到错误消息“缺少需要TRUE/FALSE的值”,即使当我手动执行此操作时if条件起作用 编辑:R 将固定点与数据帧中的间隔相匹配,r,dataframe,match,R,Dataframe,Match,我试图将一个数据框中的股票交易与当时流行的中间报价进行匹配。因此,时间戳并不完全匹配,但我只有交易发生时相应的报价时间间隔。 我写了一个可行的循环,但因为我知道应该尽可能避免循环,所以我寻找了一个替代方案。 首先,这是我的循环: 我发现了关于堆栈溢出的建议,建议合并两个数组,因此我添加了间隔的上限作为另一列,并用subset函数匹配相应的时间。 不幸的是,这种方法比循环花费的时间多得多。我想这是由于合并产生的巨大数组。带引号的数据框有500.000个观察值,事务数据有100.000个。 有没有更
我的报价数据如下所示: 和我的交易数据:
所以我想知道中引号是从后者的时间开始的,还是从前者的相应时间开始的。示例中的时间是从午夜开始的秒数。对于示例数据集,以下方法更快:
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
x2[,2]请添加一个可复制的示例。我已经编辑了问题并添加了一个示例。谢谢您的示例。什么是x1
,什么是x2
,什么是t
?对不起,我忘了:x1是报价数据,x2是交易数据。T是后者中的观察数(我将其指定为T=dim(x2)[1]),我认为我犯了一个错误。if条件应该是x1[z,1]>x2[i,1]
,替换x2[i,2]=x1[z-1,2]
,但是,我想知道如何在Rgreat中更有效地做到这一点,非常感谢。如果我有这个名声,我会投赞成票。不幸的是,当我将其应用于更长的时间序列(随机时间序列)时,你的代码需要更长的时间。对于x1中的exmaple 2000观察值和x2中的1000:单位:毫秒expr min lq中值uq max neval original()17.93335 26.32057 30.66450 31.68612 41.5735 100 new()54.19432 69.49856 73.32077 77.32665 127.2299 100
@Arne请参阅更新。希望第二种方法对于较大的数据集更快。
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
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