2016-06-15 15 views
1

Was ich zur Zeit zu tun versuchen, alle Spalten auf mehrere Spalten verteilt, zum Beispiel dieses DatenrahmenR alle Spalten Verbreitung

Person_ID Car_ID Car_Type Car_Speed 
a   1  x  50 
a   2  y  70 
a   3  z  100 
b   4  y  70 

Ich will, um uns auf diesen

Person_ID Car_ID1 Car_Type1 Car_Speed1 Car_ID2 Car_Type2 Car_Speed2 Car_ID3 Car_Type3 Car_Speed3 
a   1  x  50   2  y  70   3  z   100  
b   4  y  70 

Can jemand Hilfe? Vielen Dank.

Antwort

1

Dies kann mit dcast von data.table leicht durchgeführt werden, welche value.var mehrere nehmen können Spalten

library(data.table)#v1.9.7+ 
dcast(setDT(df1), Person_ID~rowid(Person_ID), 
       value.var = c("Car_ID", "Car_Type", "Car_Speed")) 
#  Person_ID Car_ID_1 Car_ID_2 Car_ID_3 Car_Type_1 Car_Type_2 Car_Type_3 Car_Speed_1 Car_Speed_2 
#1:   a  1  2  3   x   y   z   50   70 
#2:   b  4  NA  NA   y   NA   NA   70   NA 
# Car_Speed_3 
#1:   100 
#2:   NA 

Oder mit reshape von base R nach

df2 <- transform(df1, Seq = ave(seq_along(Person_ID), Person_ID, FUN = seq_along)) 
reshape(df2, idvar = "Person_ID", timevar = "Seq", direction = "wide") 
+0

eine Sequenz Spalte gruppiert nach 'person_id' zu schaffen habe eine Funktion "rowid" nicht gefunden oder die Rowid falsch verstanden? – newRuser

+0

@newRuser Es ist die '1.9.7' Version, die Sie vom Github herunterladen können. Erstellen Sie andernfalls eine Seq-Spalte wie in der 'base R'-Lösung mit' setDT (df1) [, Seq: = 1: .N, Person_ID] 'und machen Sie dann die' dcast' dh 'dcast (df1, Person_ID ~ Seq, value.var = c ("Car_ID", "Car_Type", "Car_Speed")) " – akrun