Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将固定点与数据帧中的间隔相匹配_R_Dataframe_Match - Fatal编程技术网

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

R 将固定点与数据帧中的间隔相匹配,r,dataframe,match,R,Dataframe,Match,我试图将一个数据框中的股票交易与当时流行的中间报价进行匹配。因此,时间戳并不完全匹配,但我只有交易发生时相应的报价时间间隔。 我写了一个可行的循环,但因为我知道应该尽可能避免循环,所以我寻找了一个替代方案。 首先,这是我的循环: 我发现了关于堆栈溢出的建议,建议合并两个数组,因此我添加了间隔的上限作为另一列,并用subset函数匹配相应的时间。 不幸的是,这种方法比循环花费的时间多得多。我想这是由于合并产生的巨大数组。带引号的数据框有500.000个观察值,事务数据有100.000个。 有没有更

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

我发现了关于堆栈溢出的建议,建议合并两个数组,因此我添加了间隔的上限作为另一列,并用subset函数匹配相应的时间。 不幸的是,这种方法比循环花费的时间多得多。我想这是由于合并产生的巨大数组。带引号的数据框有500.000个观察值,事务数据有100.000个。 有没有更优雅(尤其是更快)的方法来解决这个问题? 此外,对于某些数据,我会收到错误消息“缺少需要TRUE/FALSE的值”,即使当我手动执行此操作时if条件起作用

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

和我的交易数据:


所以我想知道中引号是从后者的时间开始的,还是从前者的相应时间开始的。示例中的时间是从午夜开始的秒数。

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

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