gpt4 book ai didi

r - 将数字向量与另一个向量中的值进行比较的最佳方法

转载 作者:行者123 更新时间:2023-12-05 00:04:57 24 4
gpt4 key购买 nike

假设我有两个值向量:

a <- c(1,3,4,5,6,7,3)
b <- c(3,5,1,3,2)

我想将整个函数 FUN应用于 a的每个输入,这是最有效的方法。

更具体地说,在这种情况下,对于我想知道的每个'a'值, b中的每个元素, a中有多少个元素大于或等于该值。幼稚的方法是执行以下操作:
sum(a < b)

当然,这是行不通的,因为它尝试并行地遍历每个向量并给我警告:

longer object length is not a multiple of shorter object length



该命令的输出btw是 b

但是,在我的情况下,我希望看到的输出是:
0 2 4 4 5 5 2

当然,我意识到我可以使用for循环来做到这一点:
out <- c()
for (i in a) {
for (i in a) { out[length(out) + 1] = sum(b<i)}
}

同样,我可以这样使用 3:
sapply(a, function(x)sum(b<x))

但是,我正在努力成为一名优秀的R程序员,并且远离for循环,并且 sapply似乎非常慢。还有其他选择吗?

对于它的值(value),我这样做了两百万次,其中 sapply总是小于 length(b),而 length(a)的范围是1到30。

最佳答案

试试这个:

findInterval(a - 0.5, sort(b))

通过使用更简单的 sort包装器,可以从以下方面提高速度:a)避免了 findInterval,b)避免了 order.Internal的开销:
order2 = function(x) .Internal(order(T, F, x))

findInterval2 = function(x, vec, rightmost.closed=F, all.inside=F) {
nx <- length(x)
index <- integer(nx)
.C('find_interv_vec', xt=as.double(vec), n=length(vec),
x=as.double(x), nx=nx, as.logical(rightmost.closed),
as.logical(all.inside), index, DUP = FALSE, NAOK=T,
PACKAGE='base')
index
}

> system.time(for (i in 1:10000) findInterval(a - 0.5, sort(b)))
user system elapsed
1.22 0.00 1.22
> system.time(for (i in 1:10000) sapply(a, function(x)sum(b<x)))
user system elapsed
0.79 0.00 0.78
> system.time(for (i in 1:10000) rowSums(outer(a, b, ">")))
user system elapsed
0.72 0.00 0.72
> system.time(for (i in 1:10000) findInterval(a - 0.5, b[order(b)]))
user system elapsed
0.42 0.00 0.42
> system.time(for (i in 1:10000) findInterval2(a - 0.5, b[order2(b)]))
user system elapsed
0.16 0.00 0.15

仅当您的迭代堆具有相当小的N时,才可以保证定义 findInterval2order2的复杂性。

N较大的时间:
> a = rep(a, 100)
> b = rep(b, 100)
> system.time(for (i in 1:100) findInterval(a - 0.5, sort(b)))
user system elapsed
0.01 0.00 0.02
> system.time(for (i in 1:100) sapply(a, function(x)sum(b<x)))
user system elapsed
0.67 0.00 0.68
> system.time(for (i in 1:100) rowSums(outer(a, b, ">")))
user system elapsed
3.67 0.26 3.94
> system.time(for (i in 1:100) findInterval(a - 0.5, b[order(b)]))
user system elapsed
0 0 0
> system.time(for (i in 1:100) findInterval2(a - 0.5, b[order2(b)]))
user system elapsed
0 0 0

关于r - 将数字向量与另一个向量中的值进行比较的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5110027/

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