Forza R non usare la notazione esponenziale (es. E + 10)?


228

Posso forzare R a usare numeri regolari invece di usare la e+10notazione simile? Io ho:

1.810032e+09
# and 
4

all'interno dello stesso vettore e vuoi vedere:

1810032000
# and
4

Sto creando l'output per un programma vecchio stile e devo scrivere un file di testo usando cat. Finora funziona bene, ma semplicemente non posso usare la e+10notazione lì.


Risposte:


228

Questa è una zona grigia. È necessario ricordare che R invocherà sempre un metodo di stampa e questi metodi di stampa ascoltano alcune opzioni. Compreso "scipen" - una penalità per la dimostrazione scientifica. Da help(options):

'scipen': numero intero. Una penalità da applicare quando si decide di stampare valori numerici in notazione fissa o esponenziale. Valori positivi sono orientati verso la fissazione e negativi verso la notazione scientifica: la notazione fissa sarà preferita a meno che non sia più ampia delle cifre "scipen".

Esempio:

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

Detto questo, lo trovo ancora confuso. Il modo più diretto è usare sprintf()con larghezza esplicita es sprintf("%.5f", ran2).


1
Grazie. Scipen sembra essere l'opzione che stavo cercando. La spettrale spiegazione della penalità mi ha fatto rifuggire. Ma il tuo esempio lo spiega bene. sprintf, eh? ti riferisci ai problemi che ho avuto con sprintf una settimana fa? :)
Matt Bannert,

4
In rstudio, se si importa un set di dati e si fa train_sample_10k = format (train_sample_10k, scientific = FALSE) e si ricarica, cambierà le notazioni scientifiche.
mixdev,

Come posso riportare le cose alla normalità dopo averlo fatto?
AIM_BLB,

6
@CSA: options("scipen"=0, "digits"=7)(quelli sono i valori predefiniti)
Scarabee

Dovresti spostare quello che ottiene il risultato options("scipen"=100, "digits"=4)in cima al codice e quello che non lo fa sotto ... con le note appropriate. Può essere fonte di confusione per qualcuno che sta cercando una soluzione rapida (e Google mostra il primo come risultato).
xbsd,

152

Può essere ottenuto disabilitando la notazione scientifica in R.

options(scipen = 999)

4
Inoltre, questo può essere inserito nel file .Rprofile in modo che venga eseguito automaticamente per impostazione predefinita.
smci,

74

La mia risposta preferita:

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

Questo ti dà quello che vuoi senza doverti preoccupare delle impostazioni R.

Si noti che restituisce una stringa di caratteri anziché un oggetto numero


1
Hm, è strano, non funziona per me. Non ricevo un errore, stampa solo la notazione scientifica.
Ovi,

Non sono sicuro di cosa potrebbe esserci di sbagliato. Ho registrato una versione molto vecchia (3.1.0) e nuova (3.4.3) di R e funziona per me in entrambi. Molto probabilmente qualche altra impostazione da qualche parte sta avendo la precedenza o hai trovato un bug specifico della versione o del caso limite in R. È possibile che tu lo stia fornendo una stringa in notazione scientifica piuttosto che un oggetto numerico? Questo lo spiegherebbe.
Danny,

10
Forse degno di nota che questo crea un personaggio anziché un numero.
cengel,

3
Se i numeri nel tuo vettore hanno lunghezze variabili, assicurati di usare justified = "none"altrimenti ci saranno spazi che li riempiono della stessa lunghezza.
Lauren Fitch,

1
format(1e6, scientific=FALSE)restituisce "1000000"mentre as.character(1e6)restituisce "1e+06", quindi c'è una differenza tra i due metodi.
Topolino

7

Inserisci il options(scipen = 999) tuo file .Rprofile in modo che venga eseguito automaticamente per impostazione predefinita . (Non fare affidamento sul farlo manualmente.)

(Questo sta dicendo qualcosa di diverso rispetto alle altre risposte: come?

  1. Ciò mantiene le cose sane quando si passa tra più progetti, più lingue su base giornaliera o mensile. Ricordare di digitare le impostazioni per progetto è soggetto a errori e non scalabile. È possibile avere un ~ / .Rprofile globale o per .profile per progetto. O entrambi, con quest'ultimo che prevale sul primo.
  2. Mantenendo tutta la configurazione in un progetto o globale. Il profilo lo esegue automaticamente. Questo è utile per es. Caricamenti di pacchetti predefiniti, configurazione data.table, ambiente ecc. Ancora una volta, quella configurazione può essere eseguita su una pagina di impostazioni, e non c'è alcuna possibilità che tu ricordi quelle e la loro sintassi e le digiti

Perché esattamente la stessa risposta? stackoverflow.com/a/27318351/680068 A parte il Rprofile po ', forse meglio modificare la risposta del GingerJack?
zx8754,

@ zx8754: non è esattamente la stessa risposta: il punto cruciale è spostare questa roba sul tuo .Rprofile. Quindi non puoi mai dimenticarlo. Inoltre, col passare del tempo il tuo .Rprofile accumula tutte le tue personalizzazioni.
smci,

1
Naturalmente dipende da te, ma la Q non è "come posso non dimenticare di fare X" ma "come posso fare X".
zx8754,

@ zx8754: ho frugato tra R e Python / panda su più progetti ogni giorno. Entrambi hanno personalizzazioni, percorsi dei pacchetti ecc. Mantiene davvero le cose sane per avere un file di configurazione comune che le memorizza. Attraverso progetti.
smci,

1
@ zx8754: quando lavori su più progetti in più lingue, la domanda "come posso fare X" si fonde con "come posso non dimenticare di fare X", in modo scalabile, coerente e automatico. Ho appena aggiunto ulteriori spiegazioni. Per chiunque sia il downvoter drive-by.
smci,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.