Eines der Dinge, die mich als Neuling bei R verwirrten, war das Formatieren einer Zahl als Prozentsatz für das Drucken.
Zum Beispiel anzeigen 0.12345
als 12.345%
. Ich habe eine Reihe von Problemumgehungen dafür, aber keine davon scheint "neuartig freundlich" zu sein. Beispielsweise:
set.seed(1)
m <- runif(5)
paste(round(100*m, 2), "%", sep="")
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
sprintf("%1.2f%%", 100*m)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
Frage: Gibt es dafür eine Basis-R-Funktion? Gibt es alternativ ein weit verbreitetes Paket, das eine praktische Verpackung bietet?
Trotz der Suche nach so etwas wie dieser in ?format
, ?formatC
und ?prettyNum
habe ich noch eine entsprechend bequeme Wrapper in der Basis zu finden R. ??"percent"
nichts brachte nützlich. library(sos); findFn("format percent")
gibt 1250 Treffer zurück - also wieder nicht sinnvoll. ggplot2
hat eine Funktion, percent
aber dies gibt keine Kontrolle über die Rundungsgenauigkeit.
quelle
sprintf
scheint die Lieblingslösung auf den Mailinglisten zu sein, und ich habe keine bessere Lösung gesehen. Eine eingebaute Funktion ist sowieso nicht viel einfacher aufzurufen, oder?sprintf
ist dies vollkommen in Ordnung für diese Untergruppe von R-Codierern, die zufällig auch Programmierer sind. Ich habe in meinem Leben viel programmiert, einschließlich COBOL (Schauder) und Fortran (zeigt mein Alter). Diesprintf
Formatierungsregeln halte ich jedoch nicht für offensichtlich (Übersetzung: WTF?). Und natürlich muss ein dedizierter Wrapper einfacher aufzurufen sein als sprintf, zum Beispiel:format_percent(x=0.12345, digits=2)
sprintf()
ist kaum zeitaufwändiger als herauszufinden, dass das Paket foo enthältformat_percent()
. Was passiert, wenn der Benutzer dann nicht in Prozent formatieren möchte, sondern etwas anderes, das ähnlich ist? Sie müssen einen anderen Wrapper finden. Auf lange Sicht werden die Basiswerkzeuge von Vorteil sein.%
das Kommentarzeichen in LaTeX das "Standard" -Berichtsformat für R ist. Obwohl es für die Beschriftung von Diagrammen nützlich sein kann, muss vorsichtig vorgegangen werden, wenn die formatierte Zahl umgeschichtet werden soll.Antworten:
Noch später:
Wie von @DzimitryM hervorgehoben,
percent()
wurde zugunsten von "zurückgezogen"label_percent()
, was ein Synonym für die altepercent_format()
Funktion ist.label_percent()
Gibt eine Funktion zurück. Um sie zu verwenden, benötigen Sie ein zusätzliches Klammerpaar.Passen Sie dies an, indem Sie Argumente in den ersten Klammern einfügen.
Ein Update, einige Jahre später:
Heutzutage enthält
percent
dasscales
Paket eine Funktion , wie in der Antwort von krlmlr dokumentiert. Verwenden Sie das anstelle meiner handgerollten Lösung.Versuchen Sie etwas wie
Bei Verwendung z.
(Wenn Sie möchten, ändern Sie das Format von
"f"
auf"g"
.)quelle
scales
ver. 1.1.0 Handbuch sagt:percent()
ist im Ruhestand; Bitte verwenden Sielabel_percent()
stattdessen, was nicht für die Formatierung von Zahlen geeignet ist . Damit die handgerollte Lösung noch relevant istÜberprüfen Sie das
scales
Paket. Es war ein Teil vonggplot2
, denke ich.Die integrierte Logik zum Erkennen der Genauigkeit sollte in den meisten Fällen gut genug funktionieren.
quelle
percent(-0.1)
produziertNaN%
scales::percent(c(-0.1, -0.2))
scales::percent(c(-0.1,-0.1,-0.1))
produziert,"NaN%" "NaN%" "NaN%"
aber Ihr Beispiel funktioniert. Als Referenz für andere ist der Fehler noch nicht behobenscales_0.2.4
. Außerdem ist die entsprechende Pull-Request-Korrektur, die sie behebt, bis heute noch nicht in der Hauptniederlassung zusammengeführt.Überprüfen Sie die
percent
Funktion aus demformattable
Paket:quelle
scales::percent
in den ersten beiden Antworten nicht der Fall ist.Ich habe einige Benchmarking-Tests für die Geschwindigkeit dieser Antworten durchgeführt und war überrascht, dass
percent
dasscales
so angepriesene Paket angesichts seiner Trägheit in diesem Paket angepriesen wurde. Ich stelle mir vor, der Vorteil ist der automatische Detektor für die richtige Formatierung, aber wenn Sie wissen, wie Ihre Daten aussehen, scheint dies eindeutig vermieden zu werden.Hier sind die Ergebnisse des Versuchs, eine Liste mit 100.000 Prozent in (0,1) auf einen Prozentsatz in zwei Ziffern zu formatieren:
So
sprintf
entsteht ein klarer Gewinner, wenn wir ein Prozentzeichen hinzufügen wollen. Wenn wir dagegen nur die Zahl und die Runde multiplizieren möchten (von Proportionen zu Prozent ohne "%" wechseln),round()
ist dies am schnellsten:quelle
Sie können das Waagenpaket nur für diesen Vorgang verwenden (ohne es mit require oder library zu laden).
quelle
Hier ist meine Lösung zum Definieren einer neuen Funktion (hauptsächlich, damit ich mit Curry herumspielen und komponieren kann :-)):
quelle
Als
scalable::percent
ich sah, dass es sich bereits als am langsamsten erwiesen hatte und Liliana Pacheco eine andere Lösung anbot, versuchte ich, sie anhand des Beispiels von Michael mit einigen anderen Optionen zu vergleichen:Dies sind die Ergebnisse, die ich erhalten habe:
Ich habe jedoch keine Ahnung, warum meine
krlmlr()
undandrie1()
so viel schlechter abschnitten als in MichaelChiricos Beispiel. Irgendwelche Hinweise?quelle
quelle
Diese Funktion könnte die Daten in Prozentsätze nach Spalten umwandeln
quelle
base2[, j] = base[ , j] * 100 / suma.c
. Es ist auch erwähnenswert, dass dies nicht gerade eine Antwort auf die Frage ist ... bei der Frage geht es darum, etwas wie0.5
"50,0%" zu formatieren , nicht um eine BerechnungDie
tidyverse
Version ist folgende:Sieht ordentlich aus wie immer.
quelle