2017-02-15 2 views
1

Ich habe einen Datenrahmen mit 2 Spalten:eine Datenrahmen-Transformation ersten Spaltenwerte als Spaltennamen verwenden

.id vals 
1 A 10 
2 B 20 
3 C 30 
4 A 100 
5 B 200 
6 C 300 

dput(tst_df) 
structure(list(.id = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), vals = c(10, 20, 30, 100, 200, 
300)), .Names = c(".id", "vals"), row.names = c(NA, -6L), class = "data.frame") 

Jetzt möchte ich die .id Spalte haben, meine Spaltennamen zu werden und die vals werden zwei Reihen geworden.

So:

A B C 
10 20 30 
100 200 300 

Grundsätzlich .id ist meine Gruppenvariable, und ich möchte alle Werte als eine Zeile, die zu 1-Gruppe haben. Ich habe etwas Einfaches erwartet wie schmelzen und transformieren. Aber nach vielen Versuchen war ich immer noch nicht erfolgreich. Kennt jemand eine Funktion, die dies erreicht?

Antwort

2

Sie können mit unstack diese in Basis R tun:

unstack(df, form=vals~.id) 
    A B C 
1 10 20 30 
2 100 200 300 

Das erste Argument ist der Name der data.frame und die zweite ist eine Formel, die die Struktur ungestapelten bestimmt.

+0

@Imo Für dieses Beispiel es tatsächlich funktioniert, wenn ich es tun auf meinem großen df es schafft eine Liste. Irgendeine Idee, wie das passieren kann? –

+0

Dies bedeutet, dass Sie nicht die gleiche Anzahl von Beobachtungen pro Level (.id) haben. Sie können die fehlenden Zeilen vor dem Implementieren von 'Entstapeln' erkennen, erstellen und 'binden', wenn die Struktur von dat.frame wichtig ist. – lmo

+1

@Imo Danke für die Hinweise! Es scheint zu funktionieren, nachdem ich die fehlenden Beobachtungen entfernt habe –

2

Sie können auch tapply verwenden,

do.call(cbind, tapply(df$vals, df$.id, I)) 
#  A B C 
#[1,] 10 20 30 
#[2,] 100 200 300 

oder in Datenrahmen wickeln, dh

as.data.frame(do.call(cbind, tapply(df$vals, df$.id, I))) 
Verwandte Themen