我有一个函数,它显示数字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的概率。
如有任何建议,我们将不胜感激。
我想您想要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)))