我想将报告中的数字格式化为significant digits,但要保留尾随的重要零并正确格式化大数
例如,数字c(10.00001,12345,1234.5,123.45,1.2345,0.12345)到3位有效数字应该是10.0,12300,1230,123,1.23,0.123但是我用不同的方法得到了不同的结果(似乎没有普遍地工作。
> numbers<-c(10.00001,12345,1234.5,123.45,1.2345,0.12345)
> for(n in seq(numbers)){
+ print(signif(numbers[n],digits=3))
+ print(format(numbers[n],digits=3))
+ print(formatC(numbers[n], digits=3,format="fg"))
+ print(formatC(numbers[n], digits=3,format="fg", flag="#"))
+ }
[1] 10
[1] "10"
[1] " 10"
[1] "10.0"
[1] 12300
[1] "12345"
[1] "12345"
[1] "12345."
[1] 1230
[1] "1234"
[1] "1234"
[1] "1234."
[1] 123
[1] "123"
[1] " 123"
[1] "123."
[1] 12.3
[1] "12.3"
[1] "12.3"
[1] "12.3"
[1] 1.23
[1] "1.23"
[1] "1.23"
[1] "1.23"
[1] 0.123
[1] "0.123"
[1] "0.123"
[1] "0.123"
这里,signif和format围绕10.00001结果。 formatC with flag =“#”正确地表示小数字而不是大数字。
有更好的方法吗?
答案 0 :(得分:27)
抱歉,我当时没有更新过这个。我的问题中的所有陈述都没有,或者是非常有效。最后我用了
print(formatC(signif(numbers[n],digits=3), digits=3,format="fg", flag="#"))
正确应对尾随零和大数字。
答案 1 :(得分:13)
您是否了解prettyNum()
及其所有选项?
答案 2 :(得分:4)
更准确的选项是options()
,它只是舍入。如果你计划这么做,我建议你看一下Sweave。
> a <- 1.23456789
> options(digits=2)
> a
[1] 1.2
> options(digits=6)
> a
[1] 1.23457
答案 3 :(得分:4)
Paul的回答的另一个修改。它似乎也留下了一个尾随的小数。我正在用gsub删除它:
sigfig <- function(vec, digits){
return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#")))
}
答案 4 :(得分:3)
如果你喜欢科学记谱法
> format(2^31-1, scientific = TRUE, digits = 3)
[1] "2.15e+09"
答案 5 :(得分:3)
保罗赫尔利的上述方法对于我的正面和负面数据都很有效。下面是一些代码,它将Paul的解决方案修改为一个函数,在该函数中可以指定所需的有效数字。
sigfig <- function(vec, n=3){
### function to round values to N significant digits
# input: vec vector of numeric
# n integer is the required sigfig
# output: outvec vector of numeric rounded to N sigfig
formatC(signif(vec,digits=n), digits=n,format="fg", flag="#")
} # end of function sigfig
验证它是否正常
numbers <- c(50000.01, 1000.001, 10.00001, 12345, 1234.5, 123.45, 1.2345, 0.12345, 0.0000123456, -50000.01, -1000.001,-10.00001, -12345, -1234.5, -123.45, -1.2345, -0.12345, -0.0000123456)
sigfig(numbers) # defaults to 3
sigfig(numbers, 3)
sigfig(numbers, 1)
sigfig(numbers, 6)