我有一個稀疏矢量列表(在R中)。我需要將此列表轉換爲稀疏矩陣。 通過for-loop做它需要很長時間。從稀疏矢量列表創建稀疏矩陣
sm<-spMatrix(length(tc2),n.col)
for(i in 1:length(tc2)){
sm[i,]<-(tc2[i])[[1]];
}
有沒有更好的方法?
我有一個稀疏矢量列表(在R中)。我需要將此列表轉換爲稀疏矩陣。 通過for-loop做它需要很長時間。從稀疏矢量列表創建稀疏矩陣
sm<-spMatrix(length(tc2),n.col)
for(i in 1:length(tc2)){
sm[i,]<-(tc2[i])[[1]];
}
有沒有更好的方法?
這裏是一個兩步的解決方案:
使用lapply()
和as(..., "sparseMatrix")
到sparseVectors列表轉換爲一列sparseMatrices的列表。
使用do.call()
和cBind()
到sparseMatrices單一稀疏矩陣結合。
require(Matrix)
# Create a list of sparseVectors
ss <- as(c(0,0,3, 3.2, 0,0,0,-3), "sparseVector")
l <- replicate(3, ss)
# Combine the sparseVectors into a single sparseMatrix
l <- lapply(l, as, "sparseMatrix")
do.call(cBind, l)
# 8 x 3 sparse Matrix of class "dgCMatrix"
#
# [1,] . . .
# [2,] . . .
# [3,] 3.0 3.0 3.0
# [4,] 3.2 3.2 3.2
# [5,] . . .
# [6,] . . .
# [7,] . . .
# [8,] -3.0 -3.0 -3.0
謝謝!這適用於這個例子,並且做我想做的(除了在do.call中使用rBind,因爲我在列表中有行)。然而,在文本數據(10K行和高達10K的功能,雖然非常稀疏),do.call掛起很長一段時間,所以我最終殺死它。有什麼建議麼? – DAF 2012-01-17 17:08:33
不知道爲什麼它運行緩慢。它看起來像'rBind'實際上可能遞歸地調用'rbind2'(它一次綁定兩行)。那**會變得非常緩慢,大量的載體會混合在一起。但是,正如我所建議的另一種方法來構建矩陣,你真的想要,我會暫緩進一步調查。乾杯。 – 2012-01-17 20:18:10
由於喬希奧布萊恩用於建議的解決方案:創建3所列出,然後創建稀疏矩陣。 我包括此這裏的代碼:荷蘭國際集團一堆矢量
vectorList2Matrix<-function(vectorList){
nzCount<-lapply(vectorList, function(x) length([email protected]));
nz<-sum(do.call(rbind,nzCount));
r<-vector(mode="integer",length=nz);
c<-vector(mode="integer",length=nz);
v<-vector(mode="integer",length=nz);
ind<-1;
for(i in 1:length(vectorList)){
ln<-length(vectorList[[i]]@i);
if(ln>0){
r[ind:(ind+ln-1)]<-i;
c[ind:(ind+ln-1)]<-vectorList[[i]]@j+1
v[ind:(ind+ln-1)]<-vectorList[[i]]@x
ind<-ind+ln;
}
}
return (sparseMatrix(i=r,j=c,x=v));
}
幫了我很多!但是,我組合了相同大小的矢量,因此我的解決方案包含的代碼少一些:http://stackoverflow.com/a/32525837/1075993 – 2015-09-11 14:30:13
此方案,cbind
,設置完美用於轉儲信息權成sparse, column-oriented矩陣(dgCMatrix
類)。
這裏有一個功能,將做到這一點:
sv.cbind <- function (...) {
input <- lapply(list(...), as, "dsparseVector")
thelength <- unique(sapply(input,length))
stopifnot(length(thelength)==1)
return(sparseMatrix(
x=unlist(lapply(input,slot,"x")),
i=unlist(lapply(input,slot,"i")),
p=c(0,cumsum(sapply(input,function(x){length([email protected])}))),
dims=c(thelength,length(input))
))
}
從一個簡單的測試,這看起來是不是強迫快約10倍+ cBind
:
require(microbenchmark)
xx <- lapply(1:10, function (k) {
sparseVector(x=rep(1,100), i=sample.int(1e4,100), length=1e4)
})
microbenchmark(do.call(sv.cbind, xx), do.call(cBind, lapply(xx,as,"sparseMatrix")))
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# do.call(sv.cbind, xx) 1.398565 1.464517 1.540172 1.49487 1.55911 3.455421 100 a
# do.call(cBind, lapply(xx, as, "sparseMatrix")) 16.037890 16.356268 16.956326 16.59854 17.49956 20.256253 100 b
我可以回答,但更多一些指導是必要的。這些矢量是以任何稀疏格式存儲的嗎?例如。你是否將'tc2 [[1]]'存儲爲一個具有很多0的數值向量,或者是否使用稀疏矩陣來表示每個向量?你能舉一個數據的例子嗎? – Iterator 2012-01-13 00:59:17
@DAF - 我的回答是否解決了你所問的問題?如果是這樣,您可以通過點擊左邊的複選標記來接受它。如果沒有,你可以添加一個稀疏向量類型的例子,你想要在稀疏矩陣中組合嗎?乾杯。 – 2012-01-13 21:40:06
@iterator - 我可以退後一步,從「itemset」列表開始,即每個條目都是一個數字列表,表示行中出現的項目/單詞。我想要有一個稀疏矩陣表示這個數據。 Josh的解決方案適用於小例子,但是對於10K行和10K項目的樣本,我耗盡內存(16 G) – DAF 2012-01-17 18:23:10