2013-04-08 101 views
-2

我有以下數據幀「j」... 並希望轉換爲零和一個矩陣, 像下面,但我尋找一個更簡單的方法在R中轉換它...矩陣表示數據幀的值的位置,例如矩陣是(81x3)...如果我在df中有一個「1」在矩陣的第一列寫入「1」,如果在df中有一個「2」,在矩陣的第二列寫入「1」......謝謝!將數據幀轉換爲一個1和1的矩陣R

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 
+3

你將不得不解釋背後你想要什麼樣的邏輯。目前這是一個完整的謎團。 – James 2013-04-08 11:29:37

+1

是的,'j'和'm'之間似乎沒有任何關係...... – juba 2013-04-08 11:30:13

+0

沒有給出足夠的解釋 – bot 2013-04-08 11:42:18

回答

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)) 
+0

Thanks ndoogan ! – user2257002 2013-04-08 12:53:44

0

@ ndoogan的方法工作,但看起來它將使更多的意義只使用矩陣索引此:

這是你的 「J」 data.frame

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

和你的空matrix, 「M」:

m <- matrix(0, 81, 3) 

「我」 也只是1:nrow(m),你可以用一個簡單的c(t(j))把你的 「J」 data.framevector。需要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