1

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

(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
4

2 に答える 2

4

相互作用変数を使用してグループを作成します。

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
于 2012-05-02T02:29:50.737 に答える
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が部分一致機能を使用することを意味すると解釈しましたが、そうではないでしょうか。次に、組み合わせて1つの列にまとめてみgrましsubgrた。

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

プレスト!列名に追加しないようにする方法を説明したり理解したりすることはできませんが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

ただし、列名をクリーンアップする必要があります。

于 2012-05-01T22:05:45.017 に答える