将R因子转换为二进制矩阵值

时间:2012-12-16 11:47:03

标签: r matrix statistics

我想将我的数据框转换为矩阵,将单个因子列扩展为多个,并根据因子分配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并没有返回我想要的内容。它们为单个因子列分配“整数”值,没有扩展。

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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

答案 2 :(得分:2)

让我们调用您的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