2016-06-13 11 views
1

Ich möchte ein Dataset von lang nach breit umformen. Insbesondere sollte das neue Wide-Dataset aus Zeilen bestehen, die der eindeutigen Anzahl von IDs im langen Dataset entsprechen, und die Anzahl der Spalten ist ein Vielfaches der eindeutigen Werte einer anderen Variablen.R Partial Reshape Daten von Long nach Wide

Lassen Sie uns sagen, dass dies die ursprünglichen Daten-Set ist:

ID a b C d e f g 
1 1 1 1 1 2 3 4 
1 1 1 2 5 6 7 8 
2 2 2 1 1 2 3 4 
2 2 2 3 9 0 1 2 
2 2 2 2 5 6 7 8 
3 3 3 3 9 0 1 2 
3 3 3 2 5 6 7 8 
3 3 3 1 1 2 3 4 

Im neuen Datensatz, die Anzahl der Zeilen ist die Anzahl der IDs, die Anzahl der Spalten 3 plus die mehrere der einzigartigen Elemente in der Variablen gefunden C und die Werte von den Variablen d bis g werden nach dem Sortieren der Variablen C in aufsteigender Reihenfolge aufgefüllt. Es sollte wie folgt aussehen:

ID a b d1 e1 f1 g1 d2 e2 f2 g2 d3 e3 f3 g3 
1 1 1 1 2 3 4 5 6 7 8 NA NA NA NA 
2 2 2 1 2 3 4 5 6 7 8 9 0 1 2 
3 3 3 1 2 3 4 5 6 7 8 9 0 1 2 

Antwort

3

können Sie verwenden dcast von data.table:

data.table::setDT(df) 
data.table::dcast(df, ID + a + b ~ C, sep = "", value.var = c("d", "e", "f", "g"), fill=NA) 

    ID a b d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 
1: 1 1 1 1 5 NA 2 6 NA 3 7 NA 4 8 NA 
2: 2 2 2 1 5 9 2 6 0 3 7 1 4 8 2 
3: 3 3 3 1 5 9 2 6 0 3 7 1 4 8 2 
+1

Gibt es eine Möglichkeit, die Daten entsprechend den Werten in der Variablen "C" aufsteigend aufzufüllen? Dieser Teil wurde weggelassen. –

+0

Es wurde kein direkter Weg angezeigt, aber Sie können die Spaltennamen nach der Ziffer sortieren. Zum Beispiel: 'c (Namen (dt) [1: 3], Namen (dt) [3:15] [Reihenfolge (str_extract (Namen (dt) [3:15]," \\ d + "))]) [1] "ID" b1 d1 e1 f1 g1 d2 e2 f2 g2 d3 e3 f3 g3 b1 "und wählen Sie die Spalten in dieser Reihenfolge aus. – Psidom

3

Basis reshape Version - müssen nur C als Zeitvariable verwenden und gehen Sie weg.

reshape(dat, idvar=c("ID","a","b"), direction="wide", timevar="C", sep="") 
# ID a b d1 e1 f1 g1 d2 e2 f2 g2 d3 e3 f3 g3 
#1 1 1 1 1 2 3 4 5 6 7 8 NA NA NA NA 
#3 2 2 2 1 2 3 4 5 6 7 8 9 0 1 2 
#6 3 3 3 1 2 3 4 5 6 7 8 9 0 1 2 
Verwandte Themen