由网友(沒你我怎麼過)分享简介:我一直在努力使用我认为非常合理的规则来格式化R中的数字。我想要的是指定有效位数(例如3位),保留有效零,并保留小数点之前的所有数字,例如(具有3位有效位):1.23456 -> "1.23"12.3456 -> "12.3"123.456 -> "123"1234.56 -> "1235"12345.6 ->...![excel中如何保留数字的有效位数](https://p.xsw88.cn/allimgs/daicuo/20230903/3859.png)
我一直在努力使用我认为非常合理的规则来格式化R中的数字。我想要的是指定有效位数(例如3位),保留有效零,并保留小数点之前的所有数字,例如(具有3位有效位):
1.23456 -> "1.23"
12.3456 -> "12.3"
123.456 -> "123"
1234.56 -> "1235"
12345.6 -> "12346"
1.50000 -> "1.50"
1.49999 -> "1.50"
R中是否有执行此类格式化的函数?如果没有,怎么做?
![excel中如何保留数字的有效位数](https://p.xsw88.cn/allimgs/daicuo/20230903/3859.png)
我觉得这些是非常合理的格式规则,但我还没有找到一个在R中以这种方式格式化的函数。据我谷歌,这不是许多类似问题的重复,如this
编辑:
受这两个好答案的启发,我自己编写了一个函数,我相信这个函数适用于所有情况:
sign_digits <- function(x,d){
s <- format(x,digits=d)
if(grepl(".", s) && ! grepl("e", s)) {
n_sign_digits <- nchar(s) -
max( grepl(".", s), attr(regexpr("(^[-0.]*)", s), "match.length") )
n_zeros <- max(0, d - n_sign_digits)
s <- paste(s, paste(rep("0", n_zeros), collapse=""), sep="")
}
s
}
推荐答案
format(num,3)
非常接近。
format(1.23456,digits=3)
# [1] "1.23"
format(12.3456,digits=3)
# [1] "12.3"
format(123.456,digits=3)
# [1] "123"
format(1234.56,digits=3)
# [1] "1235"
format(12345.6,digits=3)
# [1] "12346"
format(1.5000,digits=3)
# [1] "1.5"
format(1.4999,digits=3)
# [1] "1.5"
您的规则实际上在内部并不一致。您希望1234.56向下舍入到1234,但又希望1.4999向上舍入到1.5。
编辑这似乎处理了@Henrik提出的非常正确的观点。
sigDigits <- function(x,d){
z <- format(x,digits=d)
if (!grepl("[.]",z)) return(z)
require(stringr)
return(str_pad(z,d+1,"right","0"))
}
z <- c(1.23456, 12.3456, 123.456, 1234.56, 12345.6, 1.5000, 1.4999)
sapply(z,sigDigits,d=3)
# [1] "1.23" "12.3" "123" "1235" "12346" "1.50" "1.50"
相关推荐
最新文章