sql >> Database teknologi >  >> RDS >> Mysql

Omform tabel i MySQL eller R

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  

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  


  1. En-til-mange SQL SELECT i enkelt række

  2. Brugerdefineret dato/klokkeslæt formatering i SQL Server

  3. Begrænsning for at forhindre overtrædelse af FK-begrænsning i en tredje tabel

  4. Sådan opdateres Oracle Clob ved hjælp af JDBC