我有两个序列,它们是以秒为单位的时间。 我希望知道序列b中的哪些值在序列a的任何值的10秒内发生。
seqa = c(4.53333333333333, 7.43333333333334, 9.03333333333333, 20.6166666666667,
20.6333333333333, 42.5666666666667, 48.3166666666667, 48.8, 49.75,
55.1, 56.7833333333333, 59.3833333333333, 110.15, 113.95, 114.6)
seqb = c(18.3833333333333, 18.3833333333333, 63.8833333333333, 72.3166666666667,
76.7166666666667, 85.2166666666667, 91.25, 91.3666666666667,
96.2833333333333)
我已经用两个
for
循环完成了这个操作。遍历seqb
的每个元素并测试它是否出现在比seqa
的每个值更大的时间内,但又在10秒的限制范围内。matX <- matrix(nrow=length(seqa), ncol=length(seqb))
for(j in seq_along(seqb)){
for(i in seq_along(seqa)){
test1 <- seqb[j]>=seqa[i]
test2 <- seqb[j]<=seqa[i]+10
matX[i,j] <- sum(test1 + test2)
}
}
matX
我将结果存储在一个矩阵中。您可以看到第1、2和3列中的值为2。
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 1 1 1 1 1 1 1 1
[2,] 1 1 1 1 1 1 1 1 1
[3,] 2 2 1 1 1 1 1 1 1
[4,] 1 1 1 1 1 1 1 1 1
[5,] 1 1 1 1 1 1 1 1 1
[6,] 1 1 1 1 1 1 1 1 1
[7,] 1 1 1 1 1 1 1 1 1
[8,] 1 1 1 1 1 1 1 1 1
[9,] 1 1 1 1 1 1 1 1 1
[10,] 1 1 2 1 1 1 1 1 1
[11,] 1 1 2 1 1 1 1 1 1
[12,] 1 1 2 1 1 1 1 1 1
[13,] 1 1 1 1 1 1 1 1 1
[14,] 1 1 1 1 1 1 1 1 1
[15,] 1 1 1 1 1 1 1 1 1
out <- apply(matX, 2, function(x) any(x>=2))
seqb[out]
# [1] 18.38333 18.38333 63.88333
这些值是在至少一个
seqa
值的10秒内发生的值。(前两个值在9.03333的10秒内发生,第三个值63.8333在seqa的三个值(55.1、56.78333、59.38333)的10秒内发生。)我正在尝试加快这个过程,因为我将对大约2000个元素的序列进行一些随机化。任何想法都非常感激。
seqb [seqa [findInterval(seqb,seqa)] +10> = seqb]
,以避免将所有内容与所有内容进行比较。 - alexis_lazWarning message: In seqa[findInterval(seqb, seqa)] + dt >= seqb : longer object length is not a multiple of shorter object length
。 - jalapica()
与其他解决方案进行比较,那么它也应该构建矩阵。 - Jota