4

R での形状変更に苦労しています。3 つの異なるモデルに対して計算された 2 種類のエラー (err と rel_err) があります。これにより、合計 6 つのエラー変数 (つまり、err_1、err_2、err_3、rel_err_1、rel_err_2、および rel_err_3) が得られます。これらのタイプのエラーごとに、3 つの異なるタイプの事前有効性テスト (つまり、ランダム ホールドアウト、バックキャスト、予測) があります。データセットを長くしたいので、4 種類のテストを長く保ちながら、2 つのエラー測定も長くします。したがって、最終的には、err と呼ばれる 1 つの変数と rel_err と呼ばれる 1 つの変数、およびエラーが対応するモデル (1、2、または 3) の id 変数があります。

ここに私のデータがあります:

iter       err_1  rel_err_1      err_2  rel_err_2      err_3  rel_err_3 test_type
1 -0.09385732 -0.2235443 -0.1216982 -0.2898543 -0.1058366 -0.2520759    random
1  0.16141630  0.8575728  0.1418732  0.7537442  0.1584816  0.8419816    back
1  0.16376930  0.8700738  0.1431505  0.7605302  0.1596502  0.8481901    front
1  0.14345986  0.6765194  0.1213689  0.5723444  0.1374676  0.6482615    random
1  0.15890059  0.7435382  0.1589823  0.7439204  0.1608709  0.7527580    back
1  0.14412360  0.6743928  0.1442039  0.6747684  0.1463520  0.6848202    front

そして、これが私が望むものです:

iter     model    err           rel_err    test_type
1        1        -0.09385732    (#'s)     random
1        2        -0.1216982     (#'s)     random
1        3        -0.1216982     (#'s)     random

そして…

構文をいじってみましたが、 time.varying 引数に何を入れるかがよくわかりません

ご協力いただきありがとうございます。

4

2 に答える 2

5

あなたはそれを「難しい」方法で行うことができます。透明性のために、名前を使用できます。

with( dat, data.frame(iter = rep(iter, 3), 
      model = rep(1:3, each = nrow(dat)),
      err = c(err_1, err_2, err_3), 
      rel_err = c(rel_err_1, rel_err_2, rel_err_3), 
      test_type = rep(test_type, 3)) )

または、簡潔にするために、インデックス。

data.frame(iter = dat[,1], model = rep(1:3, each = nrow(dat)), err = dat[,c(2, 4, 6)], 
          rel_err = dat[,c(3, 5, 7)], test_type = dat[,8]) )

列がたくさんある場合、列名をgrepするのが難しい方法かもしれません。

この「難しい」方法は、コマンドの使用方法について考えるのと同じくらい簡潔でreshapeあり、あまり考える必要がありませんでした。時々、考えることをスキップしreshapeます。

于 2012-10-25T11:24:37.963 に答える
4

基本機能を使用reshapeすると、これを行うことができます

reshape(DT, direction = 'long', varying = list(paste('err',1:3,sep ='_'), paste('rel_err',1:3,sep ='_')), v.names = c('err','rel_err'), timevar = 'model')
    iter test_type model         err    rel_err id
1.1    1    random     1 -0.09385732 -0.2235443  1
2.1    1      back     1  0.16141630  0.8575728  2
3.1    1     front     1  0.16376930  0.8700738  3
4.1    1    random     1  0.14345986  0.6765194  4
5.1    1      back     1  0.15890059  0.7435382  5
6.1    1     front     1  0.14412360  0.6743928  6
1.2    1    random     2 -0.12169820 -0.2898543  1
2.2    1      back     2  0.14187320  0.7537442  2
3.2    1     front     2  0.14315050  0.7605302  3
4.2    1    random     2  0.12136890  0.5723444  4
5.2    1      back     2  0.15898230  0.7439204  5
6.2    1     front     2  0.14420390  0.6747684  6
1.3    1    random     3 -0.10583660 -0.2520759  1
2.3    1      back     3  0.15848160  0.8419816  2
3.3    1     front     3  0.15965020  0.8481901  3
4.3    1    random     3  0.13746760  0.6482615  4
5.3    1      back     3  0.16087090  0.7527580  5
6.3    1     front     3  0.14635200  0.6848202  6

reshape私は時々あなたの頭を理解するのが難しいという構文に同意します。この呼び出しがどのように機能するかを詳しく説明します

  • direction = 'long' -- 整形longする
  • varying = list(paste('err',1:3,sep ='_'), paste('rel_err',1:3,sep ='_'))-- 2 つの異なる変数にスタックしようとしているので、長さ 2 のリストを渡します。列paste('err',1:3,sep ='_')は長い形式の最初の新しい変数になり、長い形式 paste('rel_err',1:3,sep ='_'))の 2 番目の新しい変数になります
  • v.names = c('err','rel_err')2 つの新しい変数の名前を長い形式で設定します
  • timevar = 'model'時刻識別子の名前を設定します (ここでは_1、ワイド形式の列から .

これがいくらか明確になることを願っています。

于 2012-10-25T05:12:27.387 に答える