R zwingen, keine Exponentialschreibweise zu verwenden (z. B. e + 10)?

228

Kann ich R zwingen, reguläre Zahlen anstelle der e+10ähnlichen Notation zu verwenden? Ich habe:

1.810032e+09
# and 
4

innerhalb des gleichen Vektors und wollen sehen:

1810032000
# and
4

Ich erstelle eine Ausgabe für ein altmodisches Programm und muss eine Textdatei mit schreiben cat. Das funktioniert soweit gut, aber ich kann die e+10Notation dort einfach nicht verwenden .

Matt Bannert
quelle
Siehe auch
Richie Cotton

Antworten:

228

Dies ist eine Grauzone. Sie müssen sich daran erinnern, dass R immer eine Druckmethode aufruft und diese Druckmethoden einige Optionen abhören. Einschließlich "scipen" - eine Strafe für die wissenschaftliche Darstellung. Von help(options):

'scipen': Ganzzahl. Eine Strafe, die angewendet werden muss, wenn numerische Werte in fester oder exponentieller Notation gedruckt werden sollen. Positive Werte tendieren zur festen und negative zur wissenschaftlichen Notation: Die feste Notation wird bevorzugt, es sei denn, sie ist mehr als "scipen" -Ziffern breiter.

Beispiel:

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

Das heißt, ich finde es immer noch fudgeworthy. Der direkteste Weg ist die Verwendung sprintf()mit expliziter Breite, z sprintf("%.5f", ran2).

Dirk Eddelbuettel
quelle
1
Vielen Dank. scipen scheint die Option zu sein, nach der ich gesucht habe. Die gruselige Strafe erklärte mich schüchtern. Aber Ihr Beispiel erklärt es gut. Sprintf, was? Beziehen Sie sich auf die Probleme, die ich vor einer Woche mit Sprintf hatte? :)
Matt Bannert
4
Wenn Sie in rstudio ein Dataset importieren und train_sample_10k = format (train_sample_10k, wissenschaftlich = FALSE) ausführen und neu laden, werden die wissenschaftlichen Notationen geändert.
Mixdev
Wie kann ich die Dinge danach wieder normalisieren?
AIM_BLB
6
@CSA: options("scipen"=0, "digits"=7)(das sind die Standardwerte)
Scarabee
Sie sollten denjenigen, der das Ergebnis erzielt, options("scipen"=100, "digits"=4)an den Anfang des Codes verschieben und denjenigen, der nicht darunter liegt ... mit den entsprechenden Hinweisen. Es kann für jemanden verwirrend sein, der nach einer schnellen Lösung sucht (und Google zeigt die erste als Ergebnis an).
XBSD
152

Dies kann erreicht werden, indem die wissenschaftliche Notation in R deaktiviert wird.

options(scipen = 999)
GingerJack
quelle
4
Darüber hinaus kann dies in Ihre .Rprofile-Datei eingefügt werden, sodass es standardmäßig automatisch ausgeführt wird.
smci
74

Meine Lieblingsantwort:

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

Dies gibt, was Sie wollen, ohne in den R-Einstellungen herumspielen zu müssen.

Beachten Sie, dass anstelle eines Zahlenobjekts eine Zeichenfolge zurückgegeben wird

Danny
quelle
1
Hm das ist komisch, es funktioniert nicht bei mir. Ich erhalte keine Fehlermeldung, es wird nur noch die wissenschaftliche Notation gedruckt.
Ovi
Ich bin mir nicht sicher, was falsch sein könnte. Ich habe eine sehr alte (3.1.0) und eine neue (3.4.3) Version von R eingecheckt und es funktioniert für mich in beiden. Höchstwahrscheinlich hat irgendwo eine andere Einstellung Vorrang, oder Sie haben in R einen versionenspezifischen Fehler oder einen Fehler in Randfällen gefunden. Ist es möglich, dass Sie ihm eine Zeichenfolge in wissenschaftlicher Notation anstelle eines numerischen Objekts zuführen? Das würde es erklären.
Danny
10
Vielleicht bemerkenswert, dass dies ein Zeichen anstelle einer Zahl erzeugt.
Cengel
3
Wenn die Zahlen in Ihrem Vektor unterschiedlich lang sind, stellen Sie sicher, dass Sie sie verwenden. justified = "none"Andernfalls werden Leerzeichen angezeigt, die sie auf dieselbe Länge auffüllen.
Lauren Fitch
1
format(1e6, scientific=FALSE)gibt zurück , "1000000"während as.character(1e6)zurückgegeben wird "1e+06", daher gibt es einen Unterschied zwischen den beiden Methoden.
Mickey
7

Fügen Sie options(scipen = 999) Ihre .Rprofile-Datei ein, damit sie standardmäßig automatisch ausgeführt wird . (Verlassen Sie sich nicht darauf, dies manuell zu tun.)

(Dies sagt etwas anderes als andere Antworten: Wie?

  1. Dies hält die Dinge gesund, wenn Sie täglich oder monatlich zwischen mehreren Projekten und mehreren Sprachen wechseln. Das Eingeben Ihrer projektbezogenen Einstellungen ist fehleranfällig und nicht skalierbar. Sie können ein globales ~ / .R-Profil oder ein pro-Projekt-Profil haben. Oder beides, wobei letzteres das erstere außer Kraft setzt.
  2. Wenn Sie Ihre gesamte Konfiguration in einem projektweiten oder globalen .Rprofile behalten, wird sie automatisch ausgeführt. Dies ist nützlich, z. B. für das Laden von Standardpaketen, die Konfiguration von data.table, die Umgebung usw. Auch diese Konfiguration kann auf einer Seite mit Einstellungen ausgeführt werden, und es besteht keine Chance, dass Sie sich an diese und ihre Syntax erinnern und sie eingeben
smci
quelle
Warum genau die gleiche Antwort? stackoverflow.com/a/27318351/680068 Abgesehen vom Rprofile-Bit, vielleicht besser die Antwort des GingerJack bearbeiten?
zx8754
@ zx8754: Es ist nicht genau die gleiche Antwort: Der entscheidende Punkt ist, dieses Zeug in dein .Rprofile zu verschieben. Dann kann man es nie vergessen. Außerdem sammelt Ihr .Rprofile im Laufe der Zeit alle Ihre Anpassungen.
smci
1
Bis zu Ihnen natürlich, aber das Q ist nicht "wie kann ich nicht vergessen, X zu tun", sondern "wie kann ich X tun".
zx8754
@ zx8754: Ich habe täglich bei mehreren Projekten zwischen R und Python / Pandas gewechselt. Beide haben Anpassungen, Paketpfade usw. Es hält die Dinge wirklich vernünftig, wenn eine gemeinsame Konfigurationsdatei sie speichert. Projektübergreifend.
smci
1
@ zx8754: Wenn Sie an mehreren Projekten in mehreren Sprachen arbeiten, verschmilzt die Frage "Wie kann ich X ausführen?" mit "Wie kann ich nicht vergessen, X auszuführen?" auf skalierbare, konsistente und automatische Weise. Ich habe gerade weitere Erklärungen hinzugefügt. Für wen auch immer der Drive-by Downvoter ist.
smci