如何有效地为R中的巨大稀疏矩阵赋值

时间:2017-09-16 16:21:31

标签: r matrix datatable sparse-matrix

我有一个巨大的稀疏全零,我想根据另一个matrix的索引将其部分单元格替换为值1。请注意,不同的单元格将跨列替换,并提供indices。我在样本数据上尝试了这个,而且速度很慢。我的真实数据有1E8行。感谢任何建议。

library(Matrix)
library(microbenchmark)

microbenchmark(
    m1={
        n_row <- 8000
        n_col <- 5000

        # create a sparse matrix
        df <- Matrix(data=0, nrow=n_row, ncol=n_col, sparse=TRUE)

        # define indices to be replaced
        ind_replace <- data.frame(R1=c(4000, 5000), R2=c(1200, 3500), R3=c(7200, 7900))

        for (kk in 1:ncol(ind_replace)){
            df[ind_replace[1,kk]:ind_replace[2,kk], kk] <- 1
        }

    }
)

Unit: milliseconds
 expr      min       lq     mean   median       uq      max neval
   m1 18.48567 19.84298 22.48396 20.05846 20.48897 139.8459   100

1 个答案:

答案 0 :(得分:1)

R3 =c(7200,7900)中排除ind_replace后尝试此操作,因为您创建的矩阵中不存在这些列:

library(Matrix)
n_row <- 8000
n_col <- 5000
ind_replace = data.frame(R1=c(4000, 5000), R2=c(1200, 3500))
spmat<-Matrix(0,nrow = n_row ,ncol = n_col,sparse = T)

创建一个矩阵ind,其中包含非零元素的行索引和列索引。

ind = apply(ind_replace,MARGIN = 2,function(t){data.frame(a= t[1]:t[2],b= t[1])})
ind = as.matrix(Reduce(function(x,y){rbind(x,y)},ind))
spmat[ind]=1