首页 > 解决方案 > 创建一个函数/forloop,将每个 x 与所有 y 进行比较

问题描述

我有这个函数可以告诉我数字 a 是否等于或接近于零,而不是数字 b,其中 1 = 是,0 = 否:

f <- function(a,b){

  if(((b<0)&(a>= b)&(a<=-b))|((b>0)&(a<= b)&(a>=-b)))
  {
    print(1)
  }
 else
 {
  print(0)
 }

}

最终目标是确定单个数字 a 比所有 b 更接近零的概率。

例子:

a  b  prob
1  3   100% (a is equidistant or closer to zero than 5/5 b's)
2  2   60% (a is equidistant or closer to zero than 3/5 b's)
3  1   20% (a is equidistant or closer to zero than 1/5 b's)
4  1    0% (a is equidistant or closer to zero than 0/5 b's)
5  2    0% (a is equidistant or closer to zero than 0/5 b's)

我很难弄清楚如何更改函数或创建一个 forloop,以便它不会逐行计算,而是对于每个 a,它为 b 的所有值吐出 1 或 0。之后,我可以轻松地将 1 相加,然后除以观察总数,得到每个 a 的概率。

任何建议,将不胜感激。

标签: rfunction

解决方案


我想你想要ifelse,它矢量化输入和输出

f <- function(a, b) ifelse(((b < 0)&(a >= b)&(a <= -b))|((b > 0)&(a <= b)&(a >= -b)), 1, 0)

f(rnorm(10), rnorm(10))
#> [1] 1 0 0 1 0 0 1 0 0 1

尽管正如@MauritsEvers 指出的那样,仅进行逻辑测试本身并强制转换为数字向量是另一种选择:

f <- function(a, b) 1 * (((b < 0) & (a >= b) & (a <= -b)) | ((b > 0) & (a <= b) & (a >= -b)))

推荐阅读