我想将我的数据框转换为一个矩阵,该矩阵将单个因子列扩展为多个,并根据因子分配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.matrix
,as.matrix
但没有返回我想要的。他们将“整数”值分配给单个因子列,没有扩展。
我想将我的数据框转换为一个矩阵,该矩阵将单个因子列扩展为多个,并根据因子分配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.matrix
,as.matrix
但没有返回我想要的。他们将“整数”值分配给单个因子列,没有扩展。
假设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))
让我们称您为 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
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