¿Forzar a R a no usar notación exponencial (p. Ej. E + 10)?


229

¿Puedo forzar a R a usar números regulares en lugar de usar el e+10 notación similar? Yo tengo:

1.810032e+09
# and 
4

dentro del mismo vector y quiero ver:

1810032000
# and
4

Estoy creando resultados para un programa antiguo y tengo que escribir un archivo de texto usando cat. Eso funciona bien hasta ahora, pero simplemente no puedo usar la e+10notación allí.


Respuestas:


228

Esta es un área un poco gris. Debe recordar que R siempre invocará un método de impresión, y estos métodos de impresión escuchan algunas opciones. Incluyendo 'scipen' - una penalización por exhibición científica. De help(options):

'scipen': entero. Se aplica una penalización al decidir imprimir valores numéricos en notación fija o exponencial. Sesgo de valores positivos hacia la notación fija y negativa hacia notación científica: se preferirá la notación fija a menos que sea más amplia que los dígitos de 'ciencia'.

Ejemplo:

R> ran2 <- c(1.810032e+09, 4) 
R> options("scipen"=-100, "digits"=4)
R> ran2
[1] 1.81e+09 4.00e+00
R> options("scipen"=100, "digits"=4)
R> ran2
[1] 1810032000          4

Dicho esto, todavía lo encuentro fudgeable. La forma más directa es usar sprintf()con ancho explícito, por ejemplo sprintf("%.5f", ran2).


1
Gracias. scipen parece ser la opción que estaba buscando. La espeluznante explicación de penalización me hizo rehuir. Pero su ejemplo lo explica muy bien. Sprintf, ¿eh? ¿Te refieres a los problemas que tuve con sprintf hace una semana? :)
— Matt Bannert

44
En rstudio, si importa un conjunto de datos y hace train_sample_10k = format (train_sample_10k, scientific = FALSE) y vuelve a cargar, cambiará las anotaciones científicas.
— mixdev

¿Cómo vuelvo las cosas a la normalidad después de haber hecho esto?
— AIM_BLB

66
@CSA: options("scipen"=0, "digits"=7)(esos son los valores predeterminados)
— Scarabee

Debe mover el que logra el resultado options("scipen"=100, "digits"=4)a la parte superior del código, y el que no está debajo de él ... con las notas correspondientes. Puede ser confuso para alguien que está buscando una solución rápida (y Google muestra la primera como resultado).
— xbsd

152

Se puede lograr desactivando la notación científica en R.

options(scipen = 999)

44
Además, esto se puede poner en su archivo .Rprofile para que se ejecute automáticamente de forma predeterminada.
— smci

75

Mi respuesta favorita:

format(1810032000, scientific = FALSE)
# [1] "1810032000"

Esto le da lo que quiere sin tener que molestar en la configuración de R.

Tenga en cuenta que devuelve una cadena de caracteres en lugar de un objeto numérico


1
Hm, eso es raro, no funciona para mí. No recibo un error, simplemente imprime la notación científica.
— Ovi

No estoy seguro de qué podría estar mal. Revisé una versión muy antigua (3.1.0) y nueva (3.4.3) de R y me funciona en ambos. Lo más probable es que alguna otra configuración en algún lugar tenga prioridad o haya encontrado una versión específica o un error de caso de borde en R. ¿Es posible que esté introduciendo una cadena en notación científica en lugar de un objeto numérico? Eso lo explicaría.
— Danny

10
Quizás sea digno de mención que esto crea un carácter en lugar de un número.
— cengel

3
Si los números en su vector son de diferentes longitudes, asegúrese de usarlos justified = "none"o de lo contrario habrá espacios rellenándolos con la misma longitud.
— Lauren Fitch

1
format(1e6, scientific=FALSE)regresa "1000000"mientras as.character(1e6)regresa "1e+06", por lo que hay una diferencia entre los dos métodos.
— mickey

7

Ponga options(scipen = 999) su archivo .Rprofile para que se ejecute automáticamente por defecto . (No confíe en hacerlo manualmente).

(Esto dice algo diferente a otras respuestas: ¿cómo?

  1. Esto mantiene las cosas cuerdas cuando analizas múltiples proyectos, múltiples idiomas diariamente o mensualmente. Recordar escribir su configuración por proyecto es propenso a errores y no es escalable. Puede tener un ~ / .Rprofile global o un .Rprofile por proyecto. O ambos, con el último anulando al primero.
  2. Mantener toda su configuración en un proyecto global o global .Rprofile la ejecuta automáticamente. Esto es útil, por ejemplo, para cargas de paquetes predeterminadas, configuración de data.table, entorno, etc. Nuevamente, esa configuración puede ejecutarse en una página de configuraciones, y no hay ninguna posibilidad de que recuerde esas y su sintaxis y las escriba

¿Por qué exactamente la misma respuesta? stackoverflow.com/a/27318351/680068 Además del bit Rprofile, ¿quizás sea mejor editar la respuesta de GingerJack?
— zx8754

@ zx8754: no es exactamente la misma respuesta: el punto crucial es mover estas cosas a tu .Rprofile. Entonces nunca podrás olvidarlo. Además, a medida que pasa el tiempo, su .Rprofile acumula todas sus personalizaciones.
— smci

1
Depende de usted, por supuesto, pero la Q no es "cómo no puedo olvidar hacer X" sino "cómo puedo hacer X".
— zx8754

@ zx8754: Pensaba entre R y Python / pandas en varios proyectos diariamente. Ambos tienen personalizaciones, rutas de paquetes, etc. Realmente mantiene la cordura tener un archivo de configuración común que los almacene. A través de proyectos.
— smci

1
@ zx8754: cuando trabaja en varios proyectos en varios idiomas, la pregunta "¿cómo puedo hacer X?" se fusiona con "cómo no puedo olvidar hacer X", de manera escalable, coherente y automática. Acabo de agregar más explicaciones. Para quien sea el downvoter drive-by.
— smci
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.