大丈夫 - これはほとんどあなたが望むように見えます。ヘルプファイルを読んでから、これはあなたが望むことをしなければならないようです。
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
プレスト次に、私は、単一の列にgr
とsubgr
を組み合わせてみました!列名に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
とソリューションです。
基本関数 'reshape'が常にあります、私はそれに引数を理解するのに十分なスマート行ったことがないが、私はまた大食家ではありませんよ痛みのために私は通常、一貫性と使いやすさのために 'reshape2'を使います。 YMMV – Chase
reshapeとreshape2はベースRで書かれているので、パッケージをロードせずにそのアプローチを使用したい場合は、関数コンテンツを抽出するだけです(例えば、タイプをacastとコピーして関数コンテンツをコピーしてください) –
なぜパッケージを避けるのですか? –