gpt4 book ai didi

r - 比 ifelse 更有效的数字比较方法?

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

考虑简单的数据:

    > cbind(x,y)
x y
[1,] -1 99
[2,] 5 4
[3,] 10 -2
[4,] 600 0
[5,] -16 1
[6,] 0 55

现在考虑这个简单的嵌套 ifelse 语句:

ifelse(y>=0, ifelse(x<0,y,ifelse(x>y,y,x)), x)

这给了我一个结果:

[1] 99  4 10  0  1  0

应该很容易看出代码的作用:它将 x 中的值替换为:

1) 如果 x,y 都是非负数,则 y 的值较小

2) 如果 x 为负,则 y 的任何非负值

或者让 x 一个人呆着。

我的问题是:这段代码的计算效率不是很高,你能想出什么方法来有效地编码吗?谢谢!

最佳答案

另一个没有索引的选项:

x * ((x < y & x >= 0) | y < 0) + y * ((x > y & y >= 0) | x < 0) 

输出:

[1] 99  4 10  0  1  0

时间对比,看来mra68的回答是最快的:

library(microbenchmark)
microbenchmark(
TylerRinker = z[(x < y & x >= 0)| y < 0] <- x[(x < y & x >= 0)| y < 0],
mra68 =(x+y + (1+2*((x<=y)*(x>=0)-(y>=0)))*(x-y))/2,
mpalanco = x *((x < y & x >= 0)| y < 0)+ y * ((x > y & y >= 0)| x < 0),
if_else = ifelse(y>=0, ifelse(x<0,y,ifelse(x>y,y,x)), x)
)

Unit: microseconds
expr min lq mean median uq max neval cld
TylerRinker 8.800 9.7780 11.47480 10.267 10.268 75.778 100 a
mra68 5.867 6.3560 9.40188 6.845 7.334 214.623 100 a
mpalanco 7.334 7.8230 8.67836 8.311 8.800 30.312 100 a
if_else 44.489 45.9565 54.61929 53.289 53.290 245.911 100 b

关于r - 比 ifelse 更有效的数字比较方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33266412/

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