2016-09-15 56 views
3

我想建立從載體如下的矩陣:如果y的第一個元素爲5,我想使矩陣的第一行和第五列中的第1行。其他人是0如何矢量化從列索引向量擴展壓縮稀疏矩陣?

y=round(runif(30)*9)+1 
y_m=matrix(rep(0,length(y)*10),ncol=10) 
for (i in 1:length(y)){ 
    y_m[i,y[i]]=1; 
} 

有什麼辦法可以避免for循環?我試圖做y_m[,y]=1,但顯然它不工作。

+2

我認爲你的意思是*「從列索引向量展開壓縮的稀疏矩陣」* – smci

+1

不同的方法:'xtabs(rep(1,length(y))〜seq_along(y)+ y)' – alistaire

回答

4

是:使用兩列索引矩陣。從?"["

當由「[」的單個參數的索引陣列「I」可以是 矩陣與儘可能多列作爲有「x」的尺寸; 然後結果是具有對應於'i'的每一行中的索引集合的元素的向量。

設置:

set.seed(101) 
y <- round(runif(30)*9)+1 

你的方式(我精簡了矩陣構造了一下):

y_m <- matrix(0,ncol=10,nrow=length(y)) 
for (i in 1:length(y)){ 
    y_m[i,y[i]] <- 1 
} 

通過矩陣索引:

y_m2 <- matrix(0,ncol=10,nrow=length(y)) 
y_m2[cbind(1:length(y),y)] <- 1 

檢查:

all.equal(y_m,y_m2) ## TRUE 
3

您可以使用:

y_m[cbind(1:length(y), y)] <- 1 

既然你有一個稀疏矩陣,你可能想:

sparse_y_m <- Matrix::sparseMatrix(i = 1:length(y), j = y, x = 1) 

如果你想有一個完整的矩陣,使用

y_m <- as.matrix(sparse_y_m) 
2

您可以使用xtabs僅從y讓你的矩陣,通過行號的索引傳播1S的載體,即seq_along(y)然後y本身:

xtabs(rep(1, length(y)) ~ seq_along(y) + y) 
##    y 
## seq_along(y) 1 2 3 4 5 6 7 8 9 10 
##   1 0 0 0 1 0 0 0 0 0 0 
##   2 0 1 0 0 0 0 0 0 0 0 
##   3 1 0 0 0 0 0 0 0 0 0 
##   4 0 0 0 0 0 0 1 0 0 0 
##   5 0 0 0 1 0 0 0 0 0 0 
##   6 0 0 0 1 0 0 0 0 0 0 
##   ... 

或使其稀疏矩陣:

xtabs(rep(1, length(y)) ~ seq_along(y) + y, sparse = TRUE) 
## 30 x 10 sparse Matrix of class "dgCMatrix" 
##      
## 1 . . . 1 . . . . . . 
## 2 . 1 . . . . . . . . 
## 3 1 . . . . . . . . . 
## 4 . . . . . . 1 . . . 
## 5 . . . 1 . . . . . . 
## 6 . . . 1 . . . . . . 
## ... 

或用data.frame設置它,以獲得更好的標籤:

xtabs(i ~ row + y, data.frame(y, i = 1, row = seq_along(y))) 
##  y 
## row 1 2 3 4 5 6 7 8 9 10 
## 1 0 0 0 1 0 0 0 0 0 0 
## 2 0 1 0 0 0 0 0 0 0 0 
## 3 1 0 0 0 0 0 0 0 0 0 
## 4 0 0 0 0 0 0 1 0 0 0 
## 5 0 0 0 1 0 0 0 0 0 0 
## 6 0 0 0 1 0 0 0 0 0 0 
## ... 
+0

我試過了, 'data.matrix''model.matrix',非常接近...謝謝! – hxd1011