我想建立從載體如下的矩陣:如果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
,但顯然它不工作。
我想建立從載體如下的矩陣:如果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
,但顯然它不工作。
是:使用兩列索引矩陣。從?"["
:
當由「[」的單個參數的索引陣列「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
您可以使用:
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)
您可以使用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
## ...
我試過了, 'data.matrix''model.matrix',非常接近...謝謝! – hxd1011
我認爲你的意思是*「從列索引向量展開壓縮的稀疏矩陣」* – smci
不同的方法:'xtabs(rep(1,length(y))〜seq_along(y)+ y)' – alistaire