celestialgod

fast way to convert data.table to sparse matrix

Oct 8th, 2016
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 1.08 KB | None | 0 0
  1. library(data.table)
  2. library(Matrix)
  3. library(pipeR)
  4.  
  5. DT <- data.table(a = c(0,1,0), b = 0:2) %>>% `[`( , lapply(.SD, as.numeric))
  6.  
  7. sparseMat <- DT %>>%  `[`( , rn := .I) %>>% melt.data.table(id.var = "rn") %>>% `[`(value != 0) %>>%
  8.   `[`( , cn := match(variable, names(DT))) %>>% {
  9.     sparseMatrix(.$rn, .$cn, x = .$value)
  10.   }
  11.  
  12.  
  13. # benchmark
  14. library(microbenchmark)
  15. N <- 3e4
  16. p <- 200
  17.  
  18. microbenchmark(op1 = {matrix(rpois(N*p, 2), N) %>>% data.table %>>% as.matrix %>>% as("CsparseMatrix")},
  19.                op2 = {matrix(rpois(N*p, 2), N) %>>% data.table %>>% (~tmp <- names(.)) %>>%
  20.                    `[`( , rn := .I) %>>% melt.data.table(id.var = "rn") %>>%  `[`(value != 0) %>>%
  21.                    `[`( , cn := match(variable, tmp)) %>>% {
  22.                      sparseMatrix(.$rn, .$cn, x = .$value)
  23.                      }}, times = 20L)
  24. # Unit: milliseconds
  25. #  expr      min       lq     mean   median        uq       max neval
  26. #   op1 312.6052 333.5377 411.8370 445.4457  448.6806  551.1241    20
  27. #   op2 735.5928 910.1411 953.2906 968.4100 1028.0968 1087.8577    20
Advertisement
Add Comment
Please, Sign In to add comment