舍入接近 0 值

Round close to 0 values

在 Mathematica 中有一个名为 Chop 的命令,它用精确的整数 0 替换接近于零的近似实数。

我想我可以构建自己的函数,比如

chop <- function(x, tol = 1e-16) {
    ifelse(abs(x) >= tol, x, 0)
}

但是 R 中已经有内置函数了吗?

编辑: 我只想将值四舍五入到接近 0。例如:

x <- 1e-4
chop(x, tol = 1e-3)
#0
chop(1+x, tol = 1e-3)
#1.0001

zapsmall() 确实让你很接近,但这需要一个包含相当大数字的向量来比较。

zapsmall(3.5e-5, digits = 4)
#3.5e05

zapsmall(c(3.5e-5, 3.6e10), digits = 4)
#0.0e+00 3.6e+10

要正确显示它,您可以使用 format()

将其包裹起来
format(zapsmall(as.numeric(c(3.5e-5, 3.6e10)), digits = 3), scientific = FALSE, trim = TRUE)
# "0" "36000000000"

这对你有用吗?将 0.01 调整为您要应用的容差水平:

> x <- c(-0.01,0.0001,2.005,0.3, 0.01, 0.1, -0.1, -0.003)
> ifelse(abs(x) <= 0.01, 0, x)
[1]  0.000  0.000  2.005  0.300  0.000  0.100 -0.100  0.000

解决 zapsmall 需要大量数字的问题的本土解决方案:

small_as_zero <- function(x, ...){
  # ... takes arguments to all.equal
  as_zero <- 
    vapply(X = x,
           FUN = function(x, ...) isTRUE(all.equal(x, 0L, ...)),
           FUN.VALUE = logical(1),
           ...)

  x[as_zero] <- 0
  x
}

small_as_zero(c(0.00001, 0.00000001, 0.0000000001))

small_as_zero(c(0.00001, 0.00000001, 0.0000000001), tolerance = 0.001)