舍入接近0值

时间:2018-04-05 09:38:57

标签: r

在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

3 个答案:

答案 0 :(得分:1)

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"

答案 1 :(得分:0)

这对你有用吗?将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

答案 2 :(得分:0)

解决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)