比ifelse更有效的数字比较方式?

生物状态

考虑简单的数据:

    > 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。

我的问题是:此代码的计算效率不是很高,您能想到任何有效的代码编写方法吗?谢谢!

mpalanco

没有索引的另一种选择:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更有效的颜色更改方式

来自分类Dev

更快/更有效的绑定方式?

来自分类Dev

哪种沟通方式更有效

来自分类Dev

更有效的书写方式吗?

来自分类Dev

以更有效/ Python的方式调整一组行的数字刻度吗?

来自分类Dev

如何以更有效的方式检查数字是否为素数?

来自分类Dev

MPI BMP图像比较更有效

来自分类Dev

MPI BMP图像比较更有效

来自分类Dev

列表中更有效的字符串比较

来自分类Dev

在MATLAB中更有效的对称方阵的方式吗?

来自分类Dev

更短,更轻松,更有效的数据保存方式?

来自分类Dev

以编程方式创建DataGridView表的更有效方法

来自分类Dev

如何将其减少为更有效的方式

来自分类Dev

什么是清除列标题的更有效或“ pythonic”方式?

来自分类Dev

如何以更有效,更短的方式编写Javascript

来自分类Dev

在Django中更有效的分页方式

来自分类Dev

更快,更有效的方式更改日期格式

来自分类Dev

编写此查询的更有效方式?

来自分类Dev

更有效的方式来重新编码组?

来自分类Dev

以更有效的方式过滤数据帧

来自分类Dev

更有效的加载图像进行检测的方式

来自分类Dev

在OpenGL中渲染对象的哪种方式更有效?

来自分类Dev

使用 if 条件的更有效的 Pythonic 方式

来自分类Dev

什么是更有效的方式来写这个?

来自分类Dev

制作数字记忆程序的更有效方法

来自分类Dev

哪个更有效?

来自分类Dev

使循环更有效

来自分类Dev

更有效的循环

来自分类Dev

使循环更有效