R中的零分割

Ash*_*jee 8 r

是否有一种简单的方法可以避免R中的0除法错误.具体来说,

a <- c(1,0,2,0)
b <- c(3,2,1,0)
sum(b/a)
Run Code Online (Sandbox Code Playgroud)

此代码由于除以零而产生错误.我想要一种方法来定义任何/ 0 = 0,以便这种操作仍然有效.

Car*_*oft 14

好吧,让我们回顾一下.R不会返回错误.它非常正确地返回NaN.你最好有一个很好的理由拒绝你工作中的NaN值.为什么首先允许任何b元素为零?你需要考虑你的代码真正打算做什么,以及(统计上说,如何)快速抛弃所有情况的意义b[j]==0.


Cha*_*ase 8

你将分母中的所有项目设置为0 NA然后排除NA?在你的sum

a[a==0] <- NA
sum(b/a, na.rm=TRUE)
#-----
[1] 3.5
Run Code Online (Sandbox Code Playgroud)

或者不修改a:sum(b/ifelse(a==0,NA,a), na.rm = TRUE)

  • 或者`sum(ifelse(a == 0,0,b/a))` (2认同)
  • 使用==将数字与0进行比较适用于整数,但对浮点数有风险.请参阅R FAQ 7.31.最好使用像`abs(c(1,0,2,1e-9))<1e-6`之类的东西来避免与机器精度问题发生冲突. (2认同)

Sac*_*amp 7

您可以将函数"/"更改为零例外:

"/" <- function(x,y) ifelse(y==0,0,base:::"/"(x,y))
Run Code Online (Sandbox Code Playgroud)

例如:

> 10/0
[1] 0
Run Code Online (Sandbox Code Playgroud)

这是非常危险的,例如它可能会破坏其他人的代码.如果你想这样做,分配一个不同的运算符而不是改变可能是个好主意/.它在数学上也没有意义!


the*_*ail 6

如果你想掩盖所有NaNInf结果,请尝试以下方法:

a <- c(1,0,2,0)
b <- c(3,2,1,0)
result <- b/a
sum(result[is.finite(result)])
[1] 3.5
Run Code Online (Sandbox Code Playgroud)

或者全部在一行:

sum((b/a)[is.finite(b/a)])
[1] 3.5
Run Code Online (Sandbox Code Playgroud)


小智 6

我只是在类似的情况下工作。这适用于 ifelse():

sum(ifelse(a==0,0,b/a))
Run Code Online (Sandbox Code Playgroud)