【问题标题】:force Division by zero default to NaN instead of Inf强制除以零默认为 NaN 而不是 Inf
【发布时间】:2013-09-18 19:46:33
【问题描述】:

我想知道是否有一个设置我忽略了强制R 在除以零时返回NaN 而不是±Inf

我经常发现自己在做类似的事情

 results[is.infinite(results)] <- NaN

我希望完全跳过过滤/搜索过程。


示例:

### Example:

num <- c(1:5, NA)
denom <- -2:3

quotient <- num / denom
[1] -0.5 -2.0  Inf  4.0  2.5   NA

# desired results
[1] -0.5 -2.0  NaN  4.0  2.5   NA

达到预期结果的简单方法是:

quotient[is.infinite(quotient)] <- NaN

我想知道的是,是否可以避免最后一步,同时仍然获得相同的预期结果。

【问题讨论】:

  • 这并不完全有帮助,但is.finite 将为NANaNInf 返回FALSE
  • 更不用说R为什么要放Inf。除以零不是 Inf。它是未定义的。它应该是NA。我希望您的问题能够引发对这种行为的更好讨论。
  • @Elad663 是绝对正确的。放置 1/0 = Inf 显然是不正确的。投票以引起人们的注意。

标签: r division divide-by-zero


【解决方案1】:

我会切换我的谓词而不是尝试重新定义数学:

 R> is.finite(c(Inf, NA, NaN))    
 [1] FALSE FALSE FALSE 
 R> is.infinite(c(Inf, NA, NaN))   
 [1]  TRUE FALSE FALSE 
 R> is.na(c(Inf, NA, NaN)) 
 [1] FALSE  TRUE  TRUE
 R> 

【讨论】:

  • 感谢 Dirk,但我不明白更改谓词对这里有什么帮助。我错过了什么?
  • 不要设置NaN,然后测试它,只需测试!is.finite()。从长远来看,你会过得更好,因为 x / 0 对于所有正 x 来说确实是 Inf。
  • @DirkEddelbuettel 关于x/0 是错误的。 `x/0` 不是无穷大——不是在代数中,不是在微积分中,不是在编程中。考虑x =1x/yy-&gt;0 的左右限制不同意。左侧限制为-inf,右侧限制为inf。这些不是相同的限制。
  • 哎呀。感谢您的更正。 is.finite() 和朋友们仍然做正确的事。
【解决方案2】:

这些属性会有帮助吗? 0*InfNaNNaN+Inf 也是 NaN,所以尝试这样的事情也会得到你想要的结果:

quotient <- (num / denom)*0 + (num / denom)
## [1] -0.5 -2.0  NaN  4.0  2.5   NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2014-08-29
    • 1970-01-01
    • 2013-09-21
    • 2015-04-02
    • 2011-02-03
    • 2022-01-07
    相关资源
    最近更新 更多