2010-08-09 11 views
180

Tengo un número, por ejemplo 1.128347132904321674821 que me gustaría mostrar como solo dos lugares decimales cuando se imprime en una pantalla (o se escribe en un archivo). ¿Cómo hace uno eso?Formateo de espacios decimales en R

x <- 1.128347132904321674821 

EDIT:

El uso de:

options(digits=2) 

se ha sugerido como una posible respuesta. ¿Hay alguna manera de especificar esto dentro de un script para un solo uso? Cuando lo agrego a mi secuencia de comandos no parece hacer nada diferente y no estoy interesado en volver a escribir mucho para formatear cada número (estoy automatizando un informe muy grande).

-

Respuesta: round (x, dígitos = 2)

+1

pregunta relacionada: http://stackoverflow.com/questions/2287616/controlling-digits- in-r-language – Shane

+0

jaja, gracias Shane. Aunque, de nuevo, debería especificar que estaba buscando algo dentro de la base R. –

+0

cualquier razón particular para pegarse dentro de la base R (no es que sea un problema, solo tengo curiosidad) – PaulHurleyuk

Respuesta

259

Antecedentes: Algunas respuestas sugeridas en esta página (por ejemplo, signif, options(digits=...)) no garantizan que un cierto número de decimales se muestran para un número arbitrario. Supongo que esta es una característica de diseño en R por la cual las buenas prácticas científicas implican mostrar una cierta cantidad de dígitos según los principios de "significant figures". Sin embargo, en muchos dominios (p. Ej., APA style, informes comerciales), los requisitos de formato determinan que se muestre un cierto número de decimales. Esto se hace a menudo con fines de uniformidad y uniformidad en lugar de preocuparse por cifras significativas.

Solución:

El siguiente código muestra exactamente dos cifras decimales para el número x.

format(round(x, 2), nsmall = 2) 

Por ejemplo:

format(round(1.20, 2), nsmall = 2) 
# [1] "1.20" 
format(round(1, 2), nsmall = 2) 
# [1] "1.00" 
format(round(1.1234, 2), nsmall = 2) 
# [1] "1.12" 

Una función más general es el siguiente, donde x es el número y k es el número de decimales a mostrar. trimws elimina cualquier espacio en blanco inicial que puede ser útil si tiene un vector de números.

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k)) 

por ejemplo,

specify_decimal(1234, 5) 
# [1] "1234.00000" 
specify_decimal(0.1234, 5) 
# [1] "0.12340" 
+2

+1 Solo la respuesta que funcionó para mí, imprime correctamente '0.0001' como' 0.00' – ThomasH

+7

Siempre me ha molestado cómo las funciones como 'format()' y 'prettyNum()' transforman los números en caracteres. ¿Cómo abordarías esto? –

+0

¿Qué pasa con las comillas que aparecen? –

1

me parece que sería algo así como

library(tutoR) 
format(1.128347132904321674821, 2) 

por un poco de online help.

+0

Encontré esto, pero requiere un paquete, estoy buscando algo dentro del paquete base . –

+2

@brandon, format() es parte de la base. Abre el formato R y escribe? ... no se necesitan paquetes. –

+0

Hmmmm, ¿miraste lo que produce? [1] "1.128347" de lo contrario, tienes razón en que está en el paquete base, mi mal. –

3

Algo así:

options(digits=2) 

Definición de la opción de dígitos:

digits: controls the number of digits to print when printing numeric values. 
+0

¿Hay alguna forma de establecer esto dinámicamente cuando se ejecuta un script? –

+0

Esto funciona para dar salida dentro de la consola R, pero no funciona dentro de mi script (aún salen con .1289273982) –

+1

Me da un comportamiento extraño, la opción 'digits' no parece establecer el número de dígitos después decimal. Por ejemplo, cuando establezco opciones (dígitos = 2), la impresión de 7.25 da como resultado la salida de 7.2, 1234.25 se convierte en 1234 y 0.25 sigue siendo 0.25. ¿Hay otra opción interactuando con esto? –

5

Verificar funciones prettyNum, formato

que tienen ceros probando (123.1240 por ejemplo) utilizar sprintf(x, fmt='%#.4g')

+0

ITYM '... fmt = '% #. 4g') –

+0

@ 42 Defiendo aprender' sprintf', básicamente es un marco para formatear – jangorecki

+1

@jangorecki No estoy seguro de su punto. Todo lo que hice (hace más de 5 años) fue sugerir una corrección ortográfica. –

4

Bueno, los dos que vienen a la mente son

fixed(1.128347132904321674821, digits=2) 

o si lo prefiere dígitos siginificant dígitos fijos a continuación;

signif(1.128347132904321674821,digits=3) 
+1

Gracias Paul. Estos dos no eran exactamente lo que estaba buscando, pero signif me llevó a round() que es exactamente lo que necesitaba. Cheers, –

+30

'Error: no se pudo encontrar la función" fija "' – ThomasH

+0

'signif' funciona para el número específico proporcionado, pero supongo que el problema común aplicado es cuando necesitas mostrar exactamente dos lugares decimales pero no sabes cuál es el el número está adelantado. En ese caso, 'signif' dará diferentes números de decimales dependiendo del número real. –

2

Tenga en cuenta que los objetos numéricos en R se almacenan con double precision, que le da (aproximadamente) 16 dígitos decimales de precisión - el resto será ruido. Concedo que el número que se muestra arriba es solo para un ejemplo, pero tiene 22 dígitos.

+2

Confirmado, es solo por un ejemplo. Yo aplasté el teclado. –

3

La función formatC() se puede utilizar para dar formato a un número de dos cifras decimales. La función asigna dos decimales incluso cuando los valores resultantes incluyen ceros finales.

2

estoy usando esta variante de impresión vigor lugares decimales K:

# format numeric value to K decimal places 
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k) 
13

Puede probar mi paquete formattable.

> # devtools::install_github("renkun-ken/formattable") 
> library(formattable) 
> x <- formattable(1.128347132904321674821, digits = 2, format = "f") 
> x 
[1] 1.13 

Lo bueno es que, x sigue siendo un vector numérico y se puede hacer más cálculos con el mismo formato.

> x + 1 
[1] 2.13 

Aún mejor, los dígitos no se pierden, puede volver a formatear con más dígitos en cualquier momento :)

> formattable(x, digits = 6, format = "f") 
[1] 1.128347 
+0

Un pequeño pinchazo que me molesta toda la mañana. Por algún motivo, R redondearía la pantalla solo para algunas columnas. Necesitaba esta solución ya que también tenía que realizar cálculos en esas columnas. Esto funciona. Gracias ! – thethakuri

15

Puede dar formato a un número, por ejemplo x, hasta decimal lugar que desee. Aquí x es un número con muchos decimales. Supongamos que deseamos mostrar hasta 8 cifras decimales de este número:

x = 1111111234.6547389758965789345 
y = formatC(x, digits = 8, format = "f") 
# [1] "1111111234.65473890" 

Aquí format="f" da números flotando en las cifras decimales habituales decir, xxx.xxx, y digits especifica el número de dígitos. Por el contrario, si desea obtener un número entero para mostrar, usaría format="d" (muy parecido a sprintf).

+0

Si bien no tengo claro exactamente lo que estaba preguntando el OP, a juzgar por la respuesta mejor calificada, no pude evitar observar que 'formatC' es casi exclusivamente lo que uso para este propósito. Creo que esta respuesta es buena y está en la base R por solicitud del OP. – AdamO

4

por 2 cifras decimales suponiendo que desea mantener los ceros finales

sprintf(5.5, fmt = '%#.2f') 

que da

[1] "5.50" 
Cuestiones relacionadas