Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zmień kształt tabeli w MySQL lub R

W bazie R funkcja do użycia to reshape i będziesz konwertować dane z „długich” na „szerokie”.

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        <NA>        <NA>        <NA>        <NA>
# 4 10002        <NA>        <NA>        <NA>          GD          YW          GN          GN
# 8 10003          GD          GN          YW        <NA>        <NA>        <NA>        <NA>

Alternatywnie możesz spojrzeć na dcast z pakietu "reshape2" i spróbuj:

library(reshape2)
dcast(mydf, perid ~ date, value.var="rating")
#   perid 2005 2006 2007 2008 2009 2010 2011
# 1 10001   RD   GN   GD <NA> <NA> <NA> <NA>
# 2 10002 <NA> <NA> <NA>   GD   YW   GN   GN
# 3 10003   GD   GN   YW <NA> <NA> <NA> <NA>

Aby uzyskać większą prędkość, przekonwertuj data.frame do data.table i użyj dcast.data.table zamiast tego.

library(reshape2)
library(data.table)
DT <- data.table(mydf)
dcast.data.table(DT, perid ~ date, value.var = "rating")
#    perid 2005 2006 2007 2008 2009 2010 2011
# 1: 10001   RD   GN   GD   NA   NA   NA   NA
# 2: 10002   NA   NA   NA   GD   YW   GN   GN
# 3: 10003   GD   GN   YW   NA   NA   NA   NA

Z twoich komentarzy wynika, że ​​masz zduplikowane wartości wśród kombinacji kolumn 1 i 2, co oznacza, że ​​domyślnie dcast użyje length jako jego funkcję agregacji.

Aby to ominąć, musisz utworzyć dodatkową kolumnę identyfikatora (a właściwie „czas”), co można zrobić w ten sposób.

Najpierw kilka przykładowych danych. Zwróć uwagę na zduplikowaną kombinację pierwszych dwóch kolumn w wierszach 1 i 2.

mydf <- data.frame(
  period = c(10001, 10001, 10002, 10002, 10003, 10003, 10001, 10001),
  date = c(2005, 2005, 2006, 2007, 2005, 2006, 2006, 2007),
  rating = c("RD", "GN", "GD", "GD", "YW", "GN", "GD", "YN"))
mydf
#   period date 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  10001 2006     GD
# 8  10001 2007     YN

Gdy spróbujesz dcast , po prostu „zlicza” liczbę pod każdą kombinacją.

## Not what you want
dcast(mydf, period ~ date, value.var="rating")
# Aggregation function missing: defaulting to length
#   period 2005 2006 2007
# 1  10001    2    1    1
# 2  10002    0    1    1
# 3  10003    1    1    0

Albo zdecyduj, który zduplikowany wiersz należy usunąć, albo, jeśli wszystkie dane należą do Twojego zbioru danych, dodaj zmienną „czasu”, na przykład:

mydf$time <- ave(1:nrow(mydf), mydf$period, mydf$date, FUN = seq_along)
mydf
#   period date 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  10001 2007     YN    1

Teraz dcast powinien działać dobrze. Oto wersja półdługa...

dcast(mydf, period + time ~ date, value.var="rating")
#   period time 2005 2006 2007
# 1  10001    1   RD   GD   YN
# 2  10001    2   GN <NA> <NA>
# 3  10002    1 <NA>   GD   GD
# 4  10003    1   YW   GN <NA>

... i wersja półszeroka.

dcast(mydf, period ~ date + time, value.var="rating")
#   period 2005_1 2005_2 2006_1 2007_1
# 1  10001     RD     GN     GD     YN
# 2  10002   <NA>   <NA>     GD     GD
# 3  10003     YW   <NA>     GN   <NA>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak {} wpływa na zapytanie MySQL w PHP?

  2. Jak wykonać kopię zapasową baz danych MySQL za pomocą AutoMySQLBackup

  3. MySQL:Nie można utworzyć tabeli (errno:150)

  4. Python MySql Insert nie działa

  5. Jak uzyskać wyraźny rekord z tabeli mysql?