Wie man schnell Gruppen (Quartile, Dezile, etc.) bildet, indem man die Spalte (n) in einem Datenrahmen anordnet
Ich sehe eine Menge von Fragen und Antworten re order
und sort
. Gibt es etwas, die möglichen Vektoren oder data-frames in Gruppierungen (wie z.B. Quartile oder deciles)? Ich habe eine "manuelle" Lösung, aber es gibt wahrscheinlich eine bessere Lösung, group-getestet.
Hier ist mein Versuch:
temp <- data.frame(name=letters[1:12], value=rnorm(12), quartile=rep(NA, 12))
temp
# name value quartile
# 1 a 2.55118169 NA
# 2 b 0.79755259 NA
# 3 c 0.16918905 NA
# 4 d 1.73359245 NA
# 5 e 0.41027113 NA
# 6 f 0.73012966 NA
# 7 g -1.35901658 NA
# 8 h -0.80591167 NA
# 9 i 0.48966739 NA
# 10 j 0.88856758 NA
# 11 k 0.05146856 NA
# 12 l -0.12310229 NA
temp.sorted <- temp[order(temp$value), ]
temp.sorted$quartile <- rep(1:4, each=12/4)
temp <- temp.sorted[order(as.numeric(rownames(temp.sorted))), ]
temp
# name value quartile
# 1 a 2.55118169 4
# 2 b 0.79755259 3
# 3 c 0.16918905 2
# 4 d 1.73359245 4
# 5 e 0.41027113 2
# 6 f 0.73012966 3
# 7 g -1.35901658 1
# 8 h -0.80591167 1
# 9 i 0.48966739 3
# 10 j 0.88856758 4
# 11 k 0.05146856 2
# 12 l -0.12310229 1
Gibt es eine bessere (sauberere/schnellere/ein-line-Ansatz)? Danke!
InformationsquelleAutor der Frage Richard Herron | 2010-11-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Methode, die ich benutze, ist ein solcher oder
Hmisc::cut2(value, g=4)
:Eine Alternative könnte sein:
Das erste hat den Nebeneffekt der Kennzeichnung der Quartile mit den Werten, die ich als eine "gute Sache", aber wenn es nicht "gut für Sie", oder den gültigen angesprochenen Probleme in die Kommentare waren ein Anliegen könnten Sie gehen mit der version 2. Sie können
labels=
imcut
sein, oder Sie können fügen Sie diese Zeile, um Ihren code:Oder sogar noch schneller, aber etwas mehr verdecken, wie es funktioniert, obwohl es ist nicht mehr ein Faktor, sondern ein numerischer Vektor:
InformationsquelleAutor der Antwort 42-
Gibt es eine praktische
ntile
Funktion im Paketdplyr
. Es ist flexibel in dem Sinne, dass Sie kann sehr leicht definieren, die Anzahl der *Fliesen-oder "bins" die Sie erstellen möchten.Laden Sie das Paket (zuerst installieren, wenn Sie nicht haben) und fügen Sie die Quartil-Spalte:
Oder, wenn Sie verwenden möchten dplyr syntax:
Ergebnis in beiden Fällen:
Daten:
Beachten Sie, dass Sie nicht brauchen, um das "Quartil" - Spalte im Voraus, und verwenden Sie
set.seed
um die Randomisierung reproduzierbar:InformationsquelleAutor der Antwort docendo discimus
Werde ich hinzufügen, die
data.table
version für jemand anderes zu Googeln es (D. H., @BondedDust die Lösung übersetztdata.table
und reduziert ein bisschen):Ist viel besser (sauberer, schneller) als das, was ich getan hatte:
Beachten Sie jedoch, dass dieser Ansatz erfordert die Quantile zu unterscheiden, z.B. ist es nicht
rep(0:1, c(100, 1))
; was in diesem Fall zu tun ist offen, also lasse ich es bis zu Ihnen.InformationsquelleAutor der Antwort MichaelChirico
Können Sie die
quantile()
Funktion, aber Sie brauchen, um zu behandeln Rundung/Genauigkeit bei der Verwendung voncut()
. SoGeben:
InformationsquelleAutor der Antwort Gavin Simpson
Anpassung
dplyr::ntile
zu nutzendata.table
Optimierungen bietet eine schnellere Lösung.Wahrscheinlich nicht qualifizieren Sie sich als Putzfrau, aber es ist schneller und ein-line.
Timing auf größeren Datensatz
Vergleich dieser Lösung
ntile
undcut
fürdata.table
wie vorgeschlagen von @docendo_discimus und @MichaelChirico.Gibt:
InformationsquelleAutor der Antwort EMuPi
Sorry, ein bisschen spät, um die Partei. Ich wollte mein one-liner mit
cut2
da ich nicht wusste, min - /max-für meine Daten und wollte, dass die Gruppen gleich groß sind. Ich lese über cut2 in ein Thema, das markiert war, als doppelte (link unten).Ergebnis:
Ähnliches Problem, wo ich darüber gelesen cut2 im detail
InformationsquelleAutor der Antwort maze
InformationsquelleAutor der Antwort James
Ich würde gerne vorschlagen, eine version, die scheint mehr zu sein robust, da lief ich in eine Menge Probleme mit
quantile()
in den Pausen optioncut()
auf meinem dataset.Ich bin mit der
ntile
Funktionplyr
, es funktioniert aber auch mitecdf
als Eingabe.Ist das richtig?
InformationsquelleAutor der Antwort hannes101
Gibt es evtl. einen schnelleren Weg, aber ich würde tun:
InformationsquelleAutor der Antwort nico