在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
答案 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)