2010-07-14 25 views
14

que quiero formatear los números en mis informes a significant digits, pero tenga ceros significativos y correcta formato a un gran númeroFormato de números a cifras significativas bien en I

Por ejemplo los números C (10.00001,12345,1234.5,123.45, 1.2345,0.12345) a 3 dígitos significativos deben ser 10,0, 12300, 1230, 123, 1,23, 0,123, pero puedo conseguir diferentes resultados con diferentes métodos (y ninguno parece funcionar 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" 

Aquí, signif y el formato redondo el resultado 10.00001. formatC con flag = "#" correctamente hace los números pequeños pero no los números grandes.

¿Hay una manera mejor?

+0

también tratar de aplicar, lapply y sapply en lugar de bucle ... –

+0

que puede tener un error conceptual grave, pero no el 'apply' familia de funciones todavía uso de bucles? Pero abstrae los bucles para que el código sea más limpio y fácil de leer, con menos mantenimiento. ¿Derecha? –

+0

Disculpe, el ciclo está ahí solo para mostrar los resultados. Originalmente tenía signif (números, dígitos = 3), pero por alguna razón eso no pasó a la notación científica. – PaulHurleyuk

Respuesta

22

Lo siento, nunca he actualizado esto en el momento. Ninguna de las declaraciones en mi pregunta, o prettynum funcionó. Al final he usado

print(formatC(signif(numbers[n],digits=3), digits=3,format="fg", flag="#")) 

que correctamente hizo frente a cero y grandes números.

+5

Feliz de ver que el uso de 'formatC()' era la solución [ como porté esa función a R, y notablemente introduje 'format =" fg "' con bastante consideración.Normalmente, hoy en día, 'sprintf()' a menudo se prefiere a formatC(), pero de hecho, no veo una buena manera de obtener la solución a través de sprintf() en lugar de formatC(). BTW: Dado sus 'números', me pareció conveniente usar' sapply' en lugar del for loop 'sapply (números, función (N) formatC (signif (N, dígitos = 3), dígitos = 3, formato = "fg", flag = "#")) ' –

12

¿Conoce prettyNum() y todas sus opciones?

+0

Hola, genial, Dirk. Una buena opción de "base" para conocer. – isomorphismes

+0

cualquier consejo sobre cómo formatear numérico a carácter: '1000 -> 1k',' 10000 -> 10k', '1000000 -> 1M',' 1e7 -> 10M'? – jangorecki

+3

@Jan hay un paquete bastante nuevo que hace eso: [prettyunits] (http://cran.r-project.org/web/packages/prettyunits/) –

4

Una opción más barebones es options(), que simplemente redondea. Si planeas hacer esto mucho, te sugiero que revises Sweave.

> a <- 1.23456789 
> options(digits=2) 
> a 
[1] 1.2 
> options(digits=6) 
> a 
[1] 1.23457 
3

Si te gusta la notación científica método de

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

Paul Hurley anteriormente funcionó bien para mí para los dos números positivos y negativos. A continuación se muestra un código que modifica la solución de Paul en una función en la que se pueden especificar las cifras significativas deseadas.

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 

para verificar que funciona bien

numbers <- c(50000.01, 1000.001, 10.00001, 12345, 1234.5, 123.45, 1.2345, 0.12345, 0.000, -50000.01, -1000.001,-10.00001, -12345, -1234.5, -123.45, -1.2345, -0.12345, -0.000) 
sigfig(numbers) # defaults to 3 
sigfig(numbers, 3) 
sigfig(numbers, 1) 
sigfig(numbers, 6) 
1

Otra modificación de la respuesta de Pablo. Parece que también deja un decimal al final. Me estoy quitando con gsub:

sigfig <- function(vec, digits){ 
    return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#"))) 
} 
Cuestiones relacionadas