I have a list of sparse vectors (in R). I need to convert this list to a sparse matrix. Doing it via a for-loop takes a long time.
sm<-spMatrix(length(tc2),n.col)
for(i in 1:length(tc2)){
sm[i,]<-(tc2[i])[[1]];
}
是否有更好的办法?
I have a list of sparse vectors (in R). I need to convert this list to a sparse matrix. Doing it via a for-loop takes a long time.
sm<-spMatrix(length(tc2),n.col)
for(i in 1:length(tc2)){
sm[i,]<-(tc2[i])[[1]];
}
是否有更好的办法?
这里有两个步骤的解决办法:
使用lapply()
和as(......,“sparseMatrix”
,将sparseVectors的名单中改为sparseMatrices。
Use do.call()
and cBind()
to combine the sparseMatrices in a single sparseMatrix.
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
这一情景是:将信息权置于,栏目导向矩阵(dgCMatrix/code. )。
这里的职能是:
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(x@x)}))),
dims=c(thelength,length(input))
) )
}
从快速测试来看,这比胁迫+cBind
要快10倍:
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
Thanks to Josh O Brien for suggesting a solution: create 3 lists, then create sparseMatrix. I include the code for this here:
vectorList2Matrix<-function(vectorList){
nzCount<-lapply(vectorList, function(x) length(x@j));
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));
}
This is a really really simple question to which I seem to be entirely unable to get a solution. I would like to do a scatter plot of an observed time series in R, and over this I want to plot the ...
since the latest Ubuntu release (karmic koala), I noticed that the internal R package advertises on start-up the REvolution package. It seems to be a library collection for high-performance matrix ...
I am trying to run an analysis by invoking R through the command line as follows: R --no-save < SampleProgram.R > SampleProgram.opt For example, consider the simple R program below: mydata =...
I m trying to generate GOFrame objects to generate a gene ontology mapping in R for unsupported organisms (see http://www.bioconductor.org/packages/release/bioc/vignettes/GOstats/inst/doc/...
I have a dataframe df.all and I m plotting it in a bar plot with ggplot2 using the code below. I d like to make it so that the order of the dodged bars is flipped. That is, so that the bars labeled "...
I m getting a weird error when training a glmnet regression. invalid class "dgCMatrix" object: length(Dimnames[[2]]) must match Dim[2] It only happens occasionally, and perhaps only under larger ...
Sorry for the non-descriptive title but I don t know whether there s a word for what I m trying to achieve. Let s assume that I have a list of names of different classes like c( 1 , 2 , 3 , 4 ) ...
I m plotting a group of curves, using facet in ggplot2. I d like to have a smoother applied to plots where there are enough points to smooth, but not on plots with very few points. In particular I d ...