I want to format numbers in my reports to significant digits, but keep trailing significant zeroes and correctly format large numbers
For instance the numbers c(10.00001,12345,1234.5,123.45,1.2345,0.12345) to 3 significant digits should be 10.0, 12300, 1230, 123, 1.23, 0.123 but I get differing results with different methods (and none seem to work universaly.
> 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"
Here, signif and format round the 10.00001 result. formatC with flag="#" correctly does the small numbers but not the large numbers.
Is there a better way ?
signif() function in R Language is used to round to the specified number of significant digits.
scipen : integer. A penalty to be applied when deciding to print numeric values in fixed or exponential notation. Positive values bias towards fixed and negative towards scientific notation: fixed notation will be preferred unless it is more than scipen digits wider.
You can toggle between scientific notation preferences in chunks of code by turning it off as described above with options(scipen=999) and reactivating it with options(scipen=0) .
Sorry I never updated this at the time. None of the statements in my question, or prettynum worked. In the end I used
print(formatC(signif(numbers[n],digits=3), digits=3,format="fg", flag="#"))
which correctly coped with trailing zero's and big numbers.
Are you aware of prettyNum()
and all its options?
Another modification on Paul's answer. It appears that it also leaves a trailing decimal. I am removing it with gsub:
sigfig <- function(vec, digits){
return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#")))
}
A more barebones option is options()
, which just does rounding. If you plan on doing this a lot, I suggest checking out Sweave.
> a <- 1.23456789
> options(digits=2)
> a
[1] 1.2
> options(digits=6)
> a
[1] 1.23457
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With