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