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

Hilfreiche Pakete

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)


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow