I basis R vil den funktion, der skal bruges, være reshape
, og du ville konvertere dine data fra "lang" til "bred".
reshape(mydf, direction ="wide", idvar="perid", timevar="date")# perid rating.2005 rating.2006 rating.2007 rating.2008 rating.2009 rating.2010 rating. 2011# 1 10001 RD GN GD # 4 10002 GD YW GN GN# 8 10003 GD GN YW
Alternativt kan du se på dcast
fra "reshape2"-pakken og prøv:
library(reshape2)dcast(mydf, perid ~ dato, value.var="rating")# perid 2005 2006 2007 2008 2009 2010 2011# 1 10001 RD GN GD # 2 10002 GD YW GN GN# 3 10003 GD GN YW
For bedre hastighed skal du konvertere din data.frame
til en data.table
og brug dcast.data.table
i stedet.
library(reshape2)library(data.table)DT <- data.table(mydf)dcast.data.table(DT, perid ~ dato, værdi.var ="rating")# perid 2005 2006 2007 2008 2009 2010 2011# 1:10001 RD GN GD NA NA NA NA# 2:10002 NA NA NA NA GD YW GN GN# 3:10003 GD GN YW NA NA NA NA
Ud fra dine kommentarer lyder det, som om du har duplikerede værdier blandt kombinationerne af kolonne 1 og 2, hvilket betyder, at dcast
som standard vil bruge længde
som sin aggregeringsfunktion.
For at komme forbi dette, skal du lave en sekundær ID (eller "tid", faktisk) kolonne, som kan gøres sådan her.
Først nogle eksempler på data. Bemærk den duplikerede kombination af de to første kolonner i række 1 og 2.
mydf <- data.frame( periode =c(10001, 10001, 10002, 10002, 10003, 10003, 10001, 10001), dato =c(2005, 2005, 20007, 2007, 2007, 20 2006, 2007), rating =c("RD", "GN", "GD", "GD", "YW", "GN", "GD", "YN"))mydf# periode dato rating# 1 10001 2005 RD# 2 10001 2005 GN# 3 10002 2006 GD# 4 10002 2007 GD# 5 10003 2005 YW# 6 10003 2006 GN# 7 100001 7 10001 2 GD# 7 10001 2001 YN
Når du prøver dcast
, det "tæller" bare tallet under hver kombination.
## Ikke hvad du ønskededcast(mydf, periode ~ dato, værdi.var="rating")# Aggregationsfunktion mangler:standard til længde# periode 2005 2006 2007# 1 10001 2 1 1# 2 10002 0 1 1# 3 10003 1 1 0
Beslut enten hvilken duplikeret række der skal slettes, eller hvis alle data hører hjemme i dit datasæt, tilføj en "tidsvariabel" som denne:
mydf$time <- ave(1:nrow(mydf), mydf$period, mydf$date, FUN =seq_along)mydf# periode dato rating time# 1 10001 2005 RD 1# 2 10001 2005 GN 2 # 3 10002 2006 GD 1# 4 10002 2007 GD 1# 5 10003 2005 YW 1# 6 10003 2006 GN 1# 7 10001 2006 GD 1# 8 100YN 07>
Nu, dcast
burde fungere fint. Her er en halvlang version...
dcast(mydf, periode + tid ~ dato, værdi.var="rating")# periode tid 2005 2006 2007# 1 10001 1 RD GD YN# 2 10001 2 GN # 3 10002 1 GD GD# 4 10003 1 YW GN
... og en semi-bred version.
dcast(mydf, periode ~ dato + tid, værdi.var="rating")# periode 2005_1 2005_2 2006_1 2007_1# 1 10001 RD GN GD YN# 2 10002 GD GD# 3 10003 YW GN