R Language
Daten zwischen langen und breiten Formularen umformen
Suche…
Einführung
In R werden Tabellendaten in Datenrahmen gespeichert. In diesem Thema werden die verschiedenen Möglichkeiten zum Transformieren einer einzelnen Tabelle beschrieben.
Bemerkungen
Die Umformfunktion
Die flexibelste Basis-R-Funktion zum Umformen von Daten ist reshape
Umformen. Siehe ?reshape
für seine Syntax.
# create unbalanced longitudinal (panel) data set
set.seed(1234)
df <- data.frame(identifier=rep(1:5, each=3),
location=rep(c("up", "down", "left", "up", "center"), each=3),
period=rep(1:3, 5), counts=sample(35, 15, replace=TRUE),
values=runif(15, 5, 10))[-c(4,8,11),]
df
identifier location period counts values
1 1 up 1 4 9.186478
2 1 up 2 22 6.431116
3 1 up 3 22 6.334104
5 2 down 2 31 6.161130
6 2 down 3 23 6.583062
7 3 left 1 1 6.513467
9 3 left 3 24 5.199980
10 4 up 1 18 6.093998
12 4 up 3 20 7.628488
13 5 center 1 10 9.573291
14 5 center 2 33 9.156725
15 5 center 3 11 5.228851
Beachten Sie, dass der data.frame unsymmetrisch ist, d. H. Einheit 2 eine Beobachtung in der ersten Periode fehlt, während in den Einheiten 3 und 4 Beobachtungen in der zweiten Periode fehlen. Beachten Sie außerdem, dass es zwei Variablen gibt, die sich über die Zeiträume hinweg unterscheiden: Anzahl und Werte, und zwei Variablen, die nicht variieren: Bezeichner und Ort.
Lang bis breit
Um das data.frame in das Breitformat umzuwandeln,
# reshape wide on time variable
df.wide <- reshape(df, idvar="identifier", timevar="period",
v.names=c("values", "counts"), direction="wide")
df.wide
identifier location values.1 counts.1 values.2 counts.2 values.3 counts.3
1 1 up 9.186478 4 6.431116 22 6.334104 22
5 2 down NA NA 6.161130 31 6.583062 23
7 3 left 6.513467 1 NA NA 5.199980 24
10 4 up 6.093998 18 NA NA 7.628488 20
13 5 center 9.573291 10 9.156725 33 5.228851 11
Beachten Sie, dass die fehlenden Zeiträume mit NAs ausgefüllt werden.
Bei der Weiterverformung gibt das Argument "v.names" die Spalten an, die sich im Laufe der Zeit ändern. Wenn die Standortvariable nicht erforderlich ist, kann sie vor dem Umformen mit dem Argument "drop" gelöscht werden. Wenn Sie die einzige nicht variierende / nicht-id-Spalte aus dem data.frame löschen, wird das Argument v.names nicht mehr benötigt.
reshape(df, idvar="identifier", timevar="period", direction="wide",
drop="location")
Weit bis lang
Um lange mit dem aktuellen df.wide umzugestalten, ist eine minimale Syntax
reshape(df.wide, direction="long")
Dies ist jedoch in der Regel schwieriger:
# remove "." separator in df.wide names for counts and values
names(df.wide)[grep("\\.", names(df.wide))] <-
gsub("\\.", "", names(df.wide)[grep("\\.", names(df.wide))])
Jetzt erzeugt die einfache Syntax einen Fehler bezüglich undefinierter Spalten.
Mit Spaltennamen, die schwieriger für die reshape
Funktion automatisch zu analysieren, ist es manchmal notwendig , das „Variation“ Argument hinzuzufügen , die erzählte reshape
zu gruppieren bestimmte Variablen im Wide - Format für die Umwandlung in Langformat. Dieses Argument enthält eine Liste von Vektoren von Variablennamen oder Indizes.
reshape(df.wide, idvar="identifier",
varying=list(c(3,5,7), c(4,6,8)), direction="long")
Bei der Umformung von long kann das Argument "v.names" angegeben werden, um die resultierenden variablen Variablen umzubenennen.
Manchmal kann die Angabe "Variieren" vermieden werden, indem das Argument "sep" verwendet wird, das der reshape
mitteilt, welcher Teil des Variablennamens das Wertargument und das Zeitargument angibt.
Daten umformen
Oft sind Daten in Tabellen enthalten. Im Allgemeinen kann man diese Tabellendaten in Breit- und Langformate unterteilen. In einem breiten Format hat jede Variable eine eigene Spalte.
Person | Höhe (cm] | Alter [Jahr] |
---|---|---|
Alison | 178 | 20 |
Bob | 174 | 45 |
Carl | 182 | 31 |
Manchmal ist es jedoch günstiger, ein langes Format zu verwenden, in dem alle Variablen in einer Spalte und die Werte in einer zweiten Spalte enthalten sind.
Person | Variable | Wert |
---|---|---|
Alison | Höhe (cm] | 178 |
Bob | Höhe (cm] | 174 |
Carl | Höhe (cm] | 182 |
Alison | Alter [Jahr] | 20 |
Bob | Alter [Jahr] | 45 |
Carl | Alter [Jahr] | 31 |
Base R sowie Pakete von Drittanbietern können verwendet werden, um diesen Prozess zu vereinfachen. Für jede Option wird das mtcars
Dataset verwendet. Dieses Dataset hat standardmäßig ein langes Format. Damit die Pakete funktionieren, werden wir die Zeilennamen als erste Spalte einfügen.
mtcars # shows the dataset
data <- data.frame(observation=row.names(mtcars),mtcars)
Basis R
In Base R gibt es zwei Funktionen, die zum Konvertieren zwischen Breit- und Langformat verwendet werden können: stack()
und unstack()
.
long <- stack(data)
long # this shows the long format
wide <- unstack(long)
wide # this shows the wide format
Diese Funktionen können jedoch für komplexere Anwendungsfälle sehr komplex werden. Glücklicherweise gibt es andere Möglichkeiten, Pakete von Drittanbietern zu verwenden.
Das Tidyr-Paket
Dieses Paket verwendet gather()
zum Konvertieren von Wide in Long und spread()
, um von Long nach Wide zu konvertieren.
library(tidyr)
long <- gather(data, variable, value, 2:12) # where variable is the name of the
# variable column, value indicates the name of the value column and 2:12 refers to
# the columns to be converted.
long # shows the long result
wide <- spread(long,variable,value)
wide # shows the wide result (~data)
Das Paket data.table
Das Paket data.table erweitert die Funktionen von reshape2
und verwendet die Funktion melt()
, um von Wide zu Long zu dcast()
und dcast()
, um von Long nach Wide zu gelangen.
library(data.table)
long <- melt(data,'observation',2:12,'variable', 'value')
long # shows the long result
wide <- dcast(long, observation ~ variable)
wide # shows the wide result (~data)