sql >> データベース >  >> RDS >> Mysql

MySQLまたはRでテーブルの形状を変更する

    ベースRでは、使用する関数はreshapeになります。 、データを「長い」から「広い」に変換します。

    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>
    

    または、dcastを確認することもできます 「reshape2」パッケージから試してみてください:

    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>
    

    速度を上げるには、data.frameを変換します data.tabledcast.data.tableを使用します 代わりに。

    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
    

    コメントから、列1と列2の組み合わせの間で値が重複しているようです。つまり、デフォルトではdcast lengthを使用します 集計関数として。

    これを乗り越えるには、セカンダリID(または実際には「時間」)列を作成する必要があります。これは次のように実行できます。

    まず、いくつかのサンプルデータ。行1と2の最初の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
    

    dcastを試すとき 、各組み合わせの数を「カウント」するだけです。

    ## 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
    

    重複する行を削除するかどうかを決定するか、すべてのデータがデータセットに属している場合は、次のような「時間」変数を追加します。

    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
    

    さて、dcast 正常に動作するはずです。これがセミロングバージョンです...

    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>
    

    ...そしてセミワイドバージョン。

    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. WindowsServerCoreからのODBCアクセス

    2. タイムスタンプをNULLに変換するJDBC(zeroDateTimeBehaviorの問題)

    3. 職場での遭遇:特大のデータベースからスペースを取り戻す

    4. Groovyから複数のSQLステートメントを実行する