Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Format numbers to significant figures nicely in R

Tags:

r

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 ?

like image 941
PaulHurleyuk Avatar asked Jul 14 '10 12:07

PaulHurleyuk


People also ask

How do you set the number of significant figures in R?

signif() function in R Language is used to round to the specified number of significant digits.

What is Scipen in R?

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.

How do you do scientific notation in R?

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) .


4 Answers

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.

like image 139
PaulHurleyuk Avatar answered Oct 04 '22 00:10

PaulHurleyuk


Are you aware of prettyNum() and all its options?

like image 40
Dirk Eddelbuettel Avatar answered Oct 04 '22 01:10

Dirk Eddelbuettel


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="#")))
}
like image 8
JMT2080AD Avatar answered Oct 04 '22 00:10

JMT2080AD


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
like image 7
Richard Herron Avatar answered Oct 03 '22 23:10

Richard Herron