gpt4 book ai didi

r - 比较两个单调递增向量中的值

转载 作者:行者123 更新时间:2023-12-04 11:26:03 25 4
gpt4 key购买 nike

我有两个单调递增向量,v1v2长度不等。对于 v1 中的每个值(例如, v1[1], v1[2], ... ),我想在 v2 中找到值仅小于 v1[i]并计算差异。
我当前的代码(见下文)工作正常,但似乎不能很好地扩展。所以我正在寻找建议来改进我的方法,要求留在 R 中,或者使用我可以从 R 调用的包。
示例代码:

v1 <- c(3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0)
v2 <- c(0, 2, 3.2, 4.6, 5.5, 7.1, 9.9, 12, 13)

myFunc <- function(x,v2) x - max(v2[x>=v2])
v3 <- sapply(as.list(v1), FUN = myFunc, v2)

cbind(v1,v3)

v1 v3
[1,] 3.0 1.0
[2,] 3.5 0.3 # 0.3 = 3.5 - 3.2 where 3.5 is from v1[2] and 3.2 is v2[3]
[3,] 4.0 0.8
[4,] 4.5 1.3
[5,] 5.0 0.4
[6,] 5.5 0.0
[7,] 6.0 0.5
[8,] 6.5 1.0
[9,] 7.0 1.5
[10,] 7.5 0.4
[11,] 8.0 0.9
[12,] 8.5 1.4
[13,] 9.0 1.9
[14,] 9.5 2.4
[15,] 10.0 0.1
基准 1:对于小向量,比如大约 10,000 个元素,代码将在 <1 秒内运行:
> v1 <- seq(3,5000,.5)
> v2 <- seq(2.2,5200,.52)
>
> {
+ start <- Sys.time()
+ v3 <- sapply(as.list(v1), FUN = myFunc, v2)
+ Sys.time() - start
+ }
Time difference of 0.8118291 secs
基准 2:对于包含大约 100,000 个元素的向量,代码需要大约 60-80 秒。
> v1 <- seq(3,50000,.5)
> v2 <- seq(2.2,52000,.52)
>
> {
+ start <- Sys.time()
+ v3 <- sapply(as.list(v1), FUN = myFunc, v2)
+ Sys.time() - start
+ }
Time difference of 1.098762 mins
所以重申一下,我正在寻找建议来改进我的方法,以满足留在 R 中的要求,或者使用我可以从 R 调用的包。

最佳答案

使用 findInterval :

v1 - v2[findInterval(v1,v2)]
#[1] 1.0 0.3 0.8 1.3 0.4 0.0 0.5 1.0 1.5 0.4 0.9 1.4 1.9 2.4 0.1

关于r - 比较两个单调递增向量中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67904590/

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