12

データフレームを、単一の因子列を複数の列に拡張し、因子に応じて1/を割り当てる行列に変換したいと思います。0例えば

C1 C2 C3
A  3  5
B  3  4
A  1  1

次のようなものに変わるはずです

C1_A C1_B C2 C3
1      0  3  5
0      1  3  4
1      0  1  1

Rでこれを行うにはどうすればよいですか?試してみましたがdata.matrixas.matrix欲しいものが返ってきませんでした。それらは「整数」値を単一の因子列に割り当て、拡張はありません。

4

3 に答える 3

16

あなたdatのデータフレームは次のとおりです。

cbind(dat, model.matrix( ~ 0 + C1, dat))

  C1 C2 C3 C1A C1B
1  A  3  5   1   0
2  B  3  4   0   1
3  A  1  1   1   0

このソリューションは、列名を手動で指定しなくても、任意の数の因子レベルで機能します。

列を除外する場合は、次のC1コマンドを使用できます。

cbind(dat[-1], model.matrix( ~ 0 + C1, dat))
于 2012-12-16T13:39:59.710 に答える
3

data.frameと呼びましょうdf

library(reshape2)
dcast(df,C2*C3~C1,fill=0,length)

  C2 C3 A B
1  1  1 1 0
2  3  4 0 1
3  3  5 1 0
于 2012-12-16T12:01:15.817 に答える
3
dat <- read.table(text =' C1 C2 C3
A  3  5
B  3  4
A  1  1',header=T)

変換の使用

transform(dat,C1_A =ifelse(C1=='A',1,0),C1_B =ifelse(C1=='B',1,0))[,-1]
  C2 C3 C1_A C1_B
1  3  5    1    0
2  3  4    0    1
3  1  1    1    0

または、より柔軟にするために、within

within(dat,{ 
             C1_A =ifelse(C1=='A',1,0)
             C1_B =ifelse(C1=='B',1,0)})

  C1 C2 C3  C1_B C1_A
1  A  3  5    0    1
2  B  3  4    1    0
3  A  1  1    0    1
于 2012-12-16T12:20:21.993 に答える