Ich habe Probleme, den folgenden Datenrahmen neu anzuordnen:
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
Ich möchte es so umformen, dass jede eindeutige "Name" -Variable ein Rowname ist, mit den "Werten" als Beobachtungen entlang dieser Zeile und den "Zahlen" als Spaltennamen. So ähnlich:
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
Ich habe melt
und cast
und ein paar andere Dinge angeschaut , aber keiner scheint den Job zu machen.
Antworten:
Mit
reshape
Funktion:quelle
reshape
mitstats
. Ganz zu schweigen davon, dass es schneller geht! =)reshape
ist ein hervorragendes Beispiel für eine schreckliche Funktions-API. Es ist fast nutzlos.reshape
Kommentare und ähnlichen Argumentnamen sind nicht allzu hilfreich. Ich habe jedoch festgestellt, dass Sie für lange bis breite Zeitdata =
Ihren data.frame angeben müssen,idvar
= die Variable, die Ihre Gruppen identifiziert,v.names
= die Variablen, die zu mehreren Spalten im Breitformat werden,timevar
= die Variable, die die Werte enthält, die angehängt werden zuv.names
im Breitformat ,,direction = wide
undsep = "_"
. Klar genug? ;)Das neue
tidyr
Paket (2014) macht dies auch einfach, wobeigather()
/spread()
die Begriffe fürmelt
/ sindcast
.Bearbeiten: Jetzt, im Jahr 2019, hat tidyr v 1.0 gestartet und festgelegt
spread
und befindet sichgather
auf einem Verfallspfad , bevorzugt stattdessenpivot_wider
undpivot_longer
, den Sie in dieser Antwort beschrieben finden . Lesen Sie weiter, wenn Sie einen kurzen Einblick in das kurze Leben von möchtenspread/gather
.Von Github ,
quelle
tidyr
und erläutert wirdreshape2
. Es bietet gute Beispiele und Erklärungen.Sie können dies mit der
reshape()
Funktion oder mit den Funktionenmelt()
/cast()
im Umformungspaket tun . Für die zweite Option lautet der BeispielcodeOder mit
reshape2
quelle
cast
oderdcast
nicht gut funktioniert, wenn Sie keine eindeutige "Wert" -Spalte haben. Versuchendat <- data.frame(id=c(1,1,2,2),blah=c(8,4,7,6),index=c(1,2,1,2)); dcast(dat, id ~ index); cast(dat, id ~ index)
Sie es und Sie werden nicht das bekommen, was Sie erwarten. Sie müssen dasvalue/value.var
-cast(dat, id ~ index, value="blah")
unddcast(dat, id ~ index, value.var="blah")
zum Beispiel .Eine weitere Option, wenn die Leistung ein Problem darstellt, ist die Verwendung
data.table
der Erweiterung vonreshape2
Problem darstellt, Melt & Dcast-Funktionen( Referenz: Effizientes Umformen mithilfe von data.tables )
Ab data.table v1.9.6 können wir mehrere Spalten bearbeiten
quelle
data.table
Ansatz ist das Beste! sehr effizient ... Sie werden den Unterschied sehen, wennname
eine Kombination von 30-40 Spalten ist !!Mit Ihrem Beispieldatenrahmen könnten wir:
quelle
Weitere zwei Optionen:
Basispaket:
sqldf
Paket:quelle
ValCol <- unique(dat1$numbers);s <- sprintf("MAX(CASE WHEN numbers = %s THEN value ELSE NULL END) `%s`,", ValCol, ValCol);mquerym <- gsub('.{1}$','',paste(s, collapse = "\n"));mquery <- paste("SELECT name,", mquerym, "FROM dat1", "GROUP BY name", sep = "\n");sqldf(mquery)
Verwenden der Basis-R-
aggregate
Funktion:quelle
Mit der Entwicklungsversion von
tidyr
‘0.8.3.9000’
gibt espivot_wider
undpivot_longer
wird verallgemeinert, um die Umformung (lang -> breit, breit -> lang) von 1 auf mehrere Spalten . Verwendung der OP-Daten-Einzelspalte lang -> breit
-> hat eine weitere Spalte zur Darstellung der Funktionalität erstellt
quelle
Es gibt ein sehr mächtiges neues Paket von genialen Datenwissenschaftlern bei Win-Vector (Leute, die gemacht
vtreat
habenseplyr
undreplyr
) genanntcdata
. Es implementiert die in diesem Dokument und auch in diesem Blogbeitrag beschriebenen Prinzipien der "koordinierten Daten" . Die Idee ist, dass es unabhängig davon, wie Sie Ihre Daten organisieren, möglich sein sollte, einzelne Datenpunkte mithilfe eines Systems von "Datenkoordinaten" zu identifizieren. Hier ist ein Auszug aus dem letzten Blog-Beitrag von John Mount:Wir werden zuerst die Steuertabelle erstellen ( Details siehe Blog-Beitrag ) und dann die Daten von Zeilen in Spalten verschieben.
quelle
Die
reshape
Basisfunktion funktioniert einwandfrei:Wo
idvar
ist die Klassenspalte, die Zeilen trennttimevar
ist die Spalte der Klassen, die weit geworfen werden sollenv.names
ist die Spalte mit numerischen Wertendirection
Gibt ein breites oder langes Format ansep
Argument ist das Trennzeichen, das zwischentimevar
Klassennamen undv.names
in der Ausgabe verwendet wirddata.frame
.Wenn keine
idvar
vorhanden ist, erstellen Sie eine, bevor Sie diereshape()
Funktion verwenden:Denken Sie daran, dass dies
idvar
erforderlich ist! Dastimevar
undv.names
Teil ist einfach. Die Ausgabe dieser Funktion ist vorhersehbarer als einige der anderen, da alles explizit definiert ist.quelle
viel einfacher Weg!
Wenn Sie von breit zu lang zurückkehren möchten, ändern Sie nur Breit zu Lang und keine Änderungen an Objekten.
quelle