-2

我有以下数据框“j”......并且想要转换为一个由零和一个组成的矩阵,如下所示,但我正在寻找一种更简单的方法来在 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
4

2 回答 2

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))
于 2013-04-08T12:37:29.160 回答
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变成 a 。是获取您显示的订单所必需的,否则也可以使用。vectorc(t(j))tunlist

这是在实践中:

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
于 2014-12-20T09:57:45.207 回答