2012-05-01 4 views
1

下記のdata.frameを与えられたマトリックスに変換するにはどうしたらいいですか? data.frameの最初の2つの列には行変数が含まれ、他の列のすべての組み合わせ(値を含む列を除く)によって列が決定されます。理想的には、さらなるパッケージを必要としないソリューションを探しています(なしreshape2ソリューション)。また、ftable溶液もありません。data.frameを(フラット)マトリックスに変換するにはどうすればよいですか?

(df <- data.frame(c1=rep(c(1, 2), each=8), c2=rep(c(1, 2, 1, 2), each=4), 
        gr=rep(c(1, 2), 8), subgr=rep(c(1,2), 4, each=2), val=1:16)) 

c1 c2 gr1.subgr1 gr1.subgr2 gr2.subgr1 gr2.subgr2 
1 1 1   3   2   4 
1 2 5   7   6   8 
2 1 9   11   10   12 
2 2 13   15   14   16 
+0

基本関数 'reshape'が常にあります、私はそれに引数を理解するのに十分なスマート行ったことがないが、私はまた大食家ではありませんよ痛みのために私は通常、一貫性と使いやすさのために 'reshape2'を使います。 YMMV – Chase

+0

reshapeとreshape2はベースRで書かれているので、パッケージをロードせずにそのアプローチを使用したい場合は、関数コンテンツを抽出するだけです(例えば、タイプをacastとコピーして関数コンテンツをコピーしてください) –

+1

なぜパッケージを避けるのですか? –

答えて

3

グループを構築するために、相互作用変数を使用します。

newdf <- reshape(df, idvar=1:2, direction="wide", 
      timevar=interaction(df$gr,df$subgr) , 
      v.names="val", 
      drop=c("gr","subgr")) 
names(newdf)[3:6] <- c("gr1.subgr1", "gr1.subgr2", "gr2.subgr1", "gr2.subgr2") 
newdf 
    c1 c2 gr1.subgr1 gr1.subgr2 gr2.subgr1 gr2.subgr2 
1 1 1   1   2   3   4 
5 1 2   5   6   7   8 
9 2 1   9   10   11   12 
13 2 2   13   14   15   16 
+0

+1 - 見なかった/私は 'interaction()'を忘れていました。おそらく手動で構築するよりはるかに良いルートです。 – Chase

+0

ありがとう、DWin。私は元の問題でそれを作りました。私はまったく同じ型のdata.frameを持っています( 'str()'で示されています)。問題は、[エラー:[.data.frame'(data、、timevar):未定義の列が選択されています.'、何が間違っているのかわかりません。 –

+0

小さなサブセットでこのエラーが発生してから投稿できますか?出力を出力しますか? (私はちょうど新鮮なセッションでそれをもう一度実行し、エラーはありませんでした。) –

2

大丈夫 - これはほとんどあなたが望むように見えます。ヘルプファイルを読んでから、これはあなたが望むことをしなければならないようです。

reshape(df, idvar = c("c1", "c2"), timevar = c("gr", "subgr") 
     , direction = "wide") 
    c1 c2 val.c(1, 2, 1, 2) val.c(1, 1, 2, 2) 
1 1 1    NA    NA 
5 1 2    NA    NA 
9 2 1    NA    NA 
13 2 2    NA    NA 

なぜNA値で表示されるのかを完全に説明できません。しかし、多分ヘルプページからこのビットは説明する:

timevar 
the variable in long format that differentiates multiple records from the same 
group or individual. If more than one record matches, the first will be taken. 

は、私が最初にそれが列名にあいまいさがあった場合にはRは、あなたがそれを与えたが、そうでないかもしれない、それは部分一致機能をだ使用することを意味するためにかかりましたか?

df$newcol <- with(df, paste("gr.", gr, "subgr.", subgr, sep = "")) 

とのは、再びこれを試してみましょう:

reshape(df, idvar = c("c1", "c2"), timevar = "newcol" 
     , direction = "wide", drop= c("gr","subgr")) 

    c1 c2 val.gr.1subgr.1 val.gr.2subgr.1 val.gr.1subgr.2 val.gr.2subgr.2 
1 1 1    1    2    3    4 
5 1 2    5    6    7    8 
9 2 1    9    10    11    12 
13 2 2    13    14    15    16 

プレスト次に、私は、単一の列にgrsubgrを組み合わせてみました!列名にval.を追加しないようにする方法を説明することはできませんが、私はあなた自身でそれを理解しておきます。私はそれがどこかのヘルプページにあると確信しています。また、あなたが要求した順序とは異なる順序でグループを配置しますが、データは正しいと思われます。

FWIWは、ここにあなたがまだ列名をクリーンアップする必要がありますがreshape2

> dcast(c1 + c2 ~ gr + subgr, data = df, value.var = "val") 
    c1 c2 1_1 1_2 2_1 2_2 
1 1 1 1 3 2 4 
2 1 2 5 7 6 8 
3 2 1 9 11 10 12 
4 2 2 13 15 14 16 

とソリューションです。

+0

興味深い!私はRの初期の段階で 'reshape()'に 'paste(" grp "、" subgrp ")メソッドを使い、それが奇妙に思えました。あなたは私が夢中ではないと私は確信して、おそらく私は 'reshape2'を代わりに使用することを学ぶ必要があります。 – thelatemail

+0

'dcast'のバージョンは本当に素晴らしいです。 1つは 'acast'を使うこともできます。 –

関連する問題