Wie ändere ich Daten zwischen Breit- und Langformaten in R? [geschlossen]

32

Sie können Daten im Breit- oder Langformat haben. Dies ist sehr wichtig, da die verwendbaren Methoden je nach Format unterschiedlich sind. Ich weiß, dass Sie mit melt()und cast()aus dem Umgestaltungspaket arbeiten müssen, aber es scheint einige Dinge zu geben, die ich nicht verstehe.

Kann mir jemand einen kurzen Überblick geben, wie Sie das machen?

Miene
quelle
Bitte geben Sie das Beispiel dafür, was Sie erreichen möchten. Was genau bekommst du nicht?
mpiktas
3
Hier ist mein Blog-Beitrag mit einem Beispiel für die Verwendung von meltund cast. Dort erfolgt die Konvertierung von Breit- in Langformat in einem Schritt. Es gibt wirklich nichts Besonderes.
mpiktas
Willkommen zu Statistiken. Möglicherweise ist es hilfreich, einen kleinen, reproduzierbaren Datensatz in Ihre Frage aufzunehmen, um zu erläutern, was Sie möchten. Lesen Sie mehr unter sigmafield.org/2011/01/18/… .
PaulHurleyuk
In dieser SO-Frage finden Sie viele Möglichkeiten, dies zu tun.
Axeman

Antworten:

26

Auf der Website von Hadley Wickham finden Sie mehrere Ressourcen für das Paket (jetzt genannt reshape2), einschließlich eines Links zu einem Artikel über das Paket im Journal of Statistical Software.

Hier ist ein kurzes Beispiel aus dem Papier:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Wir stellen fest, dass die Daten in der breiten Form vorliegen. Um auf die lange Form zu kommen, machen wir den smithsDatenrahmen geschmolzen :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Beachten Sie, wie melt()eine der Variablen als ID ausgewählt wurde, wir können jedoch explizit angeben, welche Variable über das Argument verwendet werden soll 'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Hier ist ein weiteres Beispiel aus ?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Wenn wir den geschmolzenen Datenrahmen speichern, können wir werfen in andere Formen. In der neuen Version von reshape(genannt reshape2) gibt es Funktionen acast()und dcast()Rückkehr ein Array-like (Array, Matrix - Vektor) Ergebnis bzw. einen Datenrahmen. Diese Funktionen übernehmen auch eine Aggregationsfunktion (z. B. mean()), um Zusammenfassungen von Daten in geschmolzener Form bereitzustellen. In Anlehnung an das obige Beispiel für die Luftqualität können wir beispielsweise in breiter Form monatliche Mittelwerte für die Variablen im Datensatz generieren:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

Es gibt wirklich nur zwei Hauptfunktionen in reshape2: melt()und das acast()und dcast()Pairing. Schauen Sie sich die Beispiele auf den Hilfeseiten für diese beiden Funktionen an, besuchen Sie die Hadley-Website (Link oben) und schauen Sie sich das erwähnte Dokument an. Damit solltest du anfangen.

Sie könnten auch in Hadleys plyrPaket schauen , das ähnliche Dinge macht, reshape2aber dafür konzipiert ist, noch viel mehr zu tun.

Setzen Sie Monica - G. Simpson wieder ein
quelle
dcast(aqm, month ~ variable)Was würde dies ohne die Aggregationsfunktion tun?
Qed
@CravingSpirit würde die Anzahl der Beobachtungen für jede Variable zurückgeben. Lesen Sie, ?dcastwas Ihnen das gesagt hätte (siehe die Details für das Argument fun.aggregate).
Setzen Sie Monica - G. Simpson
8
  • Quick-R hat ein einfaches Beispiel für die Verwendung eines Umformpakets

  • Siehe auch ?reshape ( LINK ) für die Base R-Methode zum Wechseln zwischen Breit- und Langformat.

Jeromy Anglim
quelle
7

Sie müssen nicht verwenden meltund cast.

Das Umformen von Daten kann auf viele Arten erfolgen. In Ihrem speziellen Beispiel auf Ihrer Website recastmitaggregate überflüssig, da aggregatedie Aufgabe von sich aus in Ordnung ist.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

Mir gefällt, wie Sie in Ihrem Blogbeitrag erklären, was zu melttun ist. Sehr wenige Leute verstehen das und sobald Sie es sehen, wird es einfacher zu sehen, wie es castfunktioniert und wie Sie Ihre eigenen Funktionen schreiben können, wenn Sie möchten.

John
quelle
2

Siehe das reshape2-Wiki . Es bietet sicherlich mehr Beispiele, als Sie erwarten könnten.

Stéphane Laurent
quelle
2

data.tableIch stelle nur fest, dass es hier keinen Hinweis auf die effizienteren und umfassenderen Umformungsmethoden gibt. Deshalb poste ich ohne weiteren Kommentar die ausgezeichnete Antwort von Zach / Arun auf StackOverflow für eine ähnliche Frage:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

Und insbesondere gibt es die wunderbare Vignette auf der data.tableGitHub-Seite:

https://github.com/Rdatatable/data.table/wiki/Getting-started

MichaelChirico
quelle