0

最初の列にタイムポイントの列、最初の行にシリアル番号のリスト、残りのデータフレームに実際の在庫データ (アイテムの数) を含む不規則なデータフレームを扱っています。

> mydf
    V1             V2             V3             V4             V5
1 month item_serial123 item_serial234 item_serial345 item_serial456
2     0            234            120            302            500
3     1            344            125            350            450
4     2            235            129            400            300
5     3            453            145            450            330
6     4            200            130            500            200
7     5            201                           501               
8     6                                          504            202

各アイテムのシリアル番号で分析を実行できるように、「長い」リストを持つようにデータをフォーマットしようとしています。stringsAsFactors=FALSEリストから数値以外のデータを破棄し、 でフラグを設定してread.tableから mydf をデータ マトリックスに変換することにより、データが文字オブジェクトとしてインポートされることを確認できます。

> mydf.new<-data.matrix(mydf)
Warning in data.matrix(mydf) : NAs introduced by coercion
Warning in data.matrix(mydf) : NAs introduced by coercion
Warning in data.matrix(mydf) : NAs introduced by coercion
Warning in data.matrix(mydf) : NAs introduced by coercion
Warning in data.matrix(mydf) : NAs introduced by coercion
> mydf.new
     V1  V2  V3  V4  V5
[1,] NA  NA  NA  NA  NA
[2,]  0 234 120 302 500
[3,]  1 344 125 350 450
[4,]  2 235 129 400 300
[5,]  3 453 145 450 330
[6,]  4 200 130 500 200
[7,]  5 201  NA 501  NA
[8,]  6  NA  NA 504 202

変数 V1 を「時間」に変更するのは簡単です。私が本当に苦労しているのは、mydf[1,2:5]メルト/キャスト時にシリアル番号を抽出して適切なデータに割り当てる方法mydf.newです。私が巻き上げたいのは、次のようなものです。

   time count serial_number
   0    234 item_serial123
   1    344 item_serial123
   2    235 item_serial123
   3    453 item_serial123
   4    200 item_serial123
   5    201 item_serial123
   6    NA  item_serial123

などなど 何か提案はありますか?

4

1 に答える 1

0

あなたの質問を正しく理解していれば、次のような data.frame があります。

> df
  month item_serial123 item_serial234 item_serial345 item_serial456
1     0            234            120            302            500
2     1            344            125            350            450
3     2            235            129            400            300
4     3            453            145            450            330
5     4            200            130            500            200
6     5            201             NA            501             NA
7     6             NA             NA            504            202 

reshapeこれで、以下を取得するために使用できます。

> df_new <- reshape(df, idvar = "month",  varying = list(2:5), 
                    v.names="item_serial", direction = "long",
                    new.row.names=1:(prod(dim(df[,-1]))))
> df_new$time <- factor(df_new$time, labels=names(df)[-1])
> df_new
   month           time item_serial  # you may want to use `colnames`to chance them
1      0 item_serial123         234
2      1 item_serial123         344
3      2 item_serial123         235
4      3 item_serial123         453
5      4 item_serial123         200
6      5 item_serial123         201
7      6 item_serial123          NA
8      0 item_serial234         120
于 2013-11-06T23:54:48.163 に答える