gpt4 book ai didi

r - 查找出现在另一个向量值范围内的向量值

转载 作者:行者123 更新时间:2023-12-05 00:20:31 25 4
gpt4 key购买 nike

我有两个序列。它们是以秒为单位的时间。我想知道序列 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 个元素的序列进行一些随机化。任何想法都非常感谢。

最佳答案

这里有两个基本选项

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)


## via alexis_laz
a <- function() seqb[seqa[findInterval(seqb, seqa)] + 10 >= seqb]
# [1] 18.38333 18.38333 63.88333


## f
(function() {
la <- length(seqa)
lb <- length(seqb)
rr <- rep(seqb, each = la)
m <- matrix(rep(seqa, length(seqb)) - rr, la)
+(m < 0 & abs(m) <= 10)
})()

## g
o <- outer(seqa, seqb, `-`)
x <- +(o < 0 & abs(o) <= 10)

`dimnames<-`(x, list(round(seqa, 2), round(seqb, 2)))

# 18.38 18.38 63.88 72.32 76.72 85.22 91.25 91.37 96.28
# 4.53 0 0 0 0 0 0 0 0 0
# 7.43 0 0 0 0 0 0 0 0 0
# 9.03 1 1 0 0 0 0 0 0 0
# 20.62 0 0 0 0 0 0 0 0 0
# 20.63 0 0 0 0 0 0 0 0 0
# 42.57 0 0 0 0 0 0 0 0 0
# 48.32 0 0 0 0 0 0 0 0 0
# 48.8 0 0 0 0 0 0 0 0 0
# 49.75 0 0 0 0 0 0 0 0 0
# 55.1 0 0 1 0 0 0 0 0 0
# 56.78 0 0 1 0 0 0 0 0 0
# 59.38 0 0 1 0 0 0 0 0 0
# 110.15 0 0 0 0 0 0 0 0 0
# 113.95 0 0 0 0 0 0 0 0 0
# 114.6 0 0 0 0 0 0 0 0 0

我的破旧硬件上的一些长凳
library('microbenchmark')
seqa <- rep(seqa, 100)
seqb <- rep(seqb, 100)
microbenchmark(f(), g(), baseR(), DT(), unit = 'relative')
# Unit: relative
# expr min lq mean median uq max neval cld
# f() 525.3178 374.23871 402.51609 386.4717 372.50657 496.6496 100 c
# g() 293.2158 223.21560 247.40211 241.3430 225.80202 443.5323 100 bc
# baseR() 13268.9357 9357.70517 8895.30834 9111.6828 8466.15623 6702.1735 100 d
# DT() 136.1109 93.61985 96.88054 96.0771 95.03329 100.5602 100 ab
# a() 1.0000 1.00000 1.00000 1.0000 1.00000 1.0000 100 a

关于r - 查找出现在另一个向量值范围内的向量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34366703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com