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 回答