Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sparse matrix to a data frame in R

I have a sparse matrix

Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:37674] 1836 2297 108 472 1735 1899 2129 2131 5 67 ...
  ..@ p       : int [1:3417] 0 2 8 22 25 35 44 45 45 47 ...
  ..@ Dim     : int [1:2] 3416 3416
  ..@ Dimnames:List of 2
  .. ..$ : chr [1:3416] "AAA" "AAE" "AAL" "AAN" ...
  .. ..$ : chr [1:3416] "AAA" "AAE" "AAL" "AAN" ...
  ..@ x       : num [1:37674] 1 1 1 1 1 1 1 1 1 1 ...
  ..@ factors : list()

What is a fast way to convert this matrix to a list as (except for a for loop):

Origin Destination Weight
AAA AAE 4
AAL AAN 5

Note: I only need to get the Origin and Destination for Weight>0

like image 710
Seen Avatar asked Aug 19 '12 19:08

Seen


People also ask

Can we convert matrix to Dataframe in R?

A matrix can be converted to a dataframe by using a function called as. data. frame(). It will take each column from the matrix and convert it to each column in the dataframe.

Which of the following is used to convert dataset into sparseMatrix?

Converting a dataframe to sparse matrix We know that a dataframe is a table or 2-D array-like structure that has both rows and columns and is the most common way of storing data. We will convert the dataframe to a sparse matrix by using the sparseMatrix() function in R.


2 Answers

Using summary, here is an example:

mat <- Matrix(data = c(1, 0, 2, 0, 0, 3, 4, 0, 0), nrow = 3, ncol = 3,
              dimnames = list(Origin      = c("A", "B", "C"),
                              Destination = c("X", "Y", "Z")),
              sparse = TRUE)
mat
# 3 x 3 sparse Matrix of class "dgCMatrix"
#    Destination
#     X Y Z
#   A 1 . 4
#   B . . .
#   C 2 3 .

summ <- summary(mat)
summ
# 3 x 3 sparse Matrix of class "dgCMatrix", with 4 entries 
#   i j x
# 1 1 1 1
# 2 3 1 2
# 3 3 2 3
# 4 1 3 4

data.frame(Origin      = rownames(mat)[summ$i],
           Destination = colnames(mat)[summ$j],
           Weight      = summ$x)
#   Origin Destination Weight
# 1      A           X      1
# 2      C           X      2
# 3      C           Y      3
# 4      A           Z      4
like image 55
flodel Avatar answered Oct 17 '22 17:10

flodel


df <- as.data.frame(as.matrix(mat))

as.matrix will turn the sparse matrix to a dense matrix, if it is not too large:-) Then you can convert it to a data frame.

(mat is the example dgCMatrix from @flodel 's answer)

like image 12
Melkor.cz Avatar answered Oct 17 '22 18:10

Melkor.cz