我有以下数据框“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
答案 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