考虑简单的数据:
> 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句