2011-06-17 5 views
4

大きなピボットのデータフレームを使用しているため、列の変数が上端の行になります。長さの不均一な変数を持つメルト/キャストの使用R

キャスト関数のデフォルトがfun.aggregate = lengthであることを除いて、このような場合には、リシェイプパッケージが非常に便利です。おそらく、私はこれらの操作を「ケース」で実行しているため、測定される変数の数はケースによって異なります。

旋回しているデータフレームに欠落している変数が「NA」と表示されるようにピボットしたいと思います。

だから、他の言葉で、私はこのような溶融データフレームから行きたい:このような何かに

Case | Variable | Value 
1   1  2.3 
1   2  2.1 
1   3  1.3 
2   1  4.3 
2   2  2.5 
3   1  1.8 
3   2  1.9 
3   3  2.3 
3   4  2.2 

Case | Variable 1 | Variable 2 | Variable 3 | Variable 4 
1   2.3   2.1   1.3   NA 
2   4.3   2.5   NA   NA 
3   1.8   1.9   2.3   2.2 

コードdcast(データ、... 〜Variable)のデフォルト値はfun.aggregate = lengthで、これは元の値を保持しません。

ご協力ありがとうございます。不明な点がある場合はお知らせください。

+3

'reshape2'で' dcast'を試してみるべきでしょうか?私がreshape2を使って 'dcast'ステートメントを実行すると、あなたは望む出力を得ます(つまり、NAの値で)。 – joran

+0

@Joranと同意する - 'reshape2'は行く方法です –

+0

うん、私はあまりにも単純な例を作ったようですが、実際にはそのステートメントで動作するからです。それは、私が働いている大きなデータセットのためではありません。コメントしてくれてありがとう! – Jon

答えて

0

ここに1つの解決策があります。あなたが言及したパッケージや関数は使用しませんが、使用することができます。あなたのデータフレームがdfと呼ばれていると仮定します

M <- matrix(NA, 
      nrow = length(unique(df$Case)), 
      ncol = length(unique(df$Variable))+1, 
      dimnames = list(NULL,c('Case',paste('Variable',sort(unique(df$Variable)))))) 
irow <- match(df$Case,unique(df$Case)) 
icol <- match(df$Variable,unique(df$Variable)) + 1 
ientry <- irow + (icol-1)*nrow(M) 
M[ientry] <- df$Value 
M[,1] <- unique(df$Case) 
5

それはcastコールの変数のすべてを含むだけの問題です。 ReshapeはValue列をvalueと呼びますので、警告をスローしますが、正常に動作します。 fun.aggregate=lengthを使用していた理由は、数式にCaseがないためです。 Caseの値を集計しています。

試してみてください。cast(data, Case~Variable)

data <- data.frame(Case=c(1,1,1,2,2,3,3,3,3), 
    Variable=c(1,2,3,1,2,1,2,3,4), 
    Value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2)) 

cast(data,Case~Variable) 
Using Value as value column. Use the value argument to cast to override this choice 
    Case 1 2 3 4 
1 1 2.3 2.1 1.3 NA 
2 2 4.3 2.5 NA NA 
3 3 1.8 1.9 2.3 2.2 

編集:@ジョンからのコメントへの応答として。データフレームに変数がもう1つある場合はどうしますか?

data <- data.frame(expt=c(1,1,1,1,2,2,2,2,2), 
       func=c(1,1,1,2,2,3,3,3,3), 
       variable=c(1,2,3,1,2,1,2,3,4), 
       value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2)) 

cast(data,expt+variable~func) 
    expt variable 1 2 3 
1 1  1 2.3 4.3 NA 
2 1  2 2.1 NA NA 
3 1  3 1.3 NA NA 
4 2  1 NA NA 1.8 
5 2  2 NA 2.5 1.9 
6 2  3 NA NA 2.3 
7 2  4 NA NA 2.2 
+0

私はまだこのfun.aggregateステートメントを理解しようとしています。私は、 "Expt"、 "function"、 "variable"、 "value"の列ヘッダーを持つ溶融データフレームを持っています。私の関数はdcast(data、Expt + variable〜function)です。私はまだ "集計関数がありません:長さをデフォルトにする"エラーが発生します。 – Jon

+0

@Jonもしあなたの溶けた 'data'データフレームにある4つのカラムが全てであれば、' cast(data、Expt + variable〜function) 'が動作するはずです。新しい情報で質問を編集すると、私は自分の答えを更新しようとします。 – Seth

0

警告メッセージを回避するには、すなわち三つのレベルA、B、Cを有するカテゴリ変数、他の変数に応じて、データフレームのサブセットができました。カテゴリーaの現在のデータには70のケースがあり、bの80のケースではcのデータが90であるため、キャスト関数はそれらを集計する方法を知らないためです。

これが役に立ちます。

関連する問題