Format numbers to significant figures nicely in R

Viewed 53403

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 ?

7 Answers

If you like scientific notation

> format(2^31-1, scientific = TRUE, digits = 3)
[1] "2.15e+09"

The following option replicates the format of formatC(format="fg",flag="#") (fg is a special version of f where the digits specify significant digits and not digits after the decimal point, and the # flag causes fg to not drop trailing zeroes):

> f=2;x=c(10000.0001,1111,111.11,11.1,1.1,1.99,.01,.001,0,-.11,-.9,-.000011)
> dig=abs(pmin(0,floor(log10(abs(x)))-f+1))
> sprintf(paste0("%.",ifelse(is.infinite(dig),0,dig),"f"),x)
 [1] "10000"     "1111"      "111"       "11"        "1.1"       "2.0"
 [7] "0.010"     "0.0010"    "0"         "-0.11"     "-0.90"     "-0.000011"
> sub("\\.$","",formatC(x,f,,"fg","#"))
 [1] "10000"     "1111"      "111"       "11"        "1.1"       "2.0"
 [7] "0.010"     "0.0010"    "0"         "-0.11"     "-0.90"     "-0.000011"
Related