将数据帧转换为R中的1和0矩阵

时间:2013-04-08 11:26:19

标签: r

我有以下数据框“j”...... 并希望转换为0和1的矩阵, 如下所示,但我寻找一种更简单的方法将其转换为R ...矩阵表示数据帧的值的位置,例如矩阵是(81x3)...如果我有一个在df中“1”,将在矩阵的第一列中写入“1”,如果在df中得到“2”,则在矩阵的第二列中写入“1”。谢谢!

g <- h <- i <- c(1:3)
j<-expand.grid(g,h,i)
j
     Var1 Var2 Var3
1     1    1    1
2     2    1    1
3     3    1    1
4     1    2    1
5     2    2    2
.
.
.
m<-matrix(0,81,3)
m[1,1]=m[1,1]+1;m[2,1]=m[2,1]+1;m[3,1]=m[3,1]+1
m[4,2]=m[4,2]+1;m[5,1]=m[5,1]+1;m[6,1]=m[6,1]+1
m[7,3]=m[7,3]+1;m[8,1]=m[8,1]+1;m[9,1]=m[9,1]+1
m[10,1]=m[10,1]+1;m[11,2]=m[11,2]+1;m[12,1]=m[12,1]+1
m[13,2]=m[13,2]+1;m[14,2]=m[14,2]+1;m[15,1]=m[15,1]+1
m[16,2]=m[16,2]+1;m[17,2]=m[17,2]+1;m[18,2]=m[18,2]+1
head(m)
     [,1] [,2] [,3]

 [1,]    1    0    0
 [2,]    1    0    0
 [3,]    1    0    0
 [4,]    0    1    0
 [5,]    1    0    0
 [6,]    1    0    0
 [7,]    0    0    1
 [8,]    1    0    0
 [9,]    1    0    0
[10,]    1    0    0
[11,]    0    1    0
[12,]    1    0    0
[13,]    0    1    0
[14,]    0    1    0
[15,]    0    1    0

2 个答案:

答案 0 :(得分:1)

感觉古怪,但这就是我提出的:

g <- h <- i <- c(1:3)
j<-expand.grid(g,h,i)

tmp<-c(0,0,0)
t(sapply(t(j),function(x,tmp){ tmp[x]<-1;tmp }, tmp))

答案 1 :(得分:0)

@ ndoogan的方法很有效,但似乎只使用矩阵索引会更有意义:

这是你的“j”data.frame

j <- expand.grid(replicate(3, 1:3, FALSE))

你的空matrix,“m”:

m <- matrix(0, 81, 3)

“i”只是1:nrow(m),您可以将“j”data.frame转换为vector,并使用简单c(t(j))。获取您显示的订单需要t,否则也可以使用unlist

这是实践中的:

m[cbind(1:81, c(t(j)))] <- 1
head(m, 10)
#       [,1] [,2] [,3]
#  [1,]    1    0    0
#  [2,]    1    0    0
#  [3,]    1    0    0
#  [4,]    0    1    0
#  [5,]    1    0    0
#  [6,]    1    0    0
#  [7,]    0    0    1
#  [8,]    1    0    0
#  [9,]    1    0    0
# [10,]    1    0    0