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
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
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)
df <- as.data.frame(as.matrix(m))
If the sparse matrix is to large, I found that converting it in chunks works. Modify the "step_size" variable below to change the chunk size. Change "ncol" and "cbind" to "nrow" and "rbind" if you want to chunk it row-wise instead of column-wise.
large_matrix_to_df <- function(m){
iter = 1
step_size = 5000
output = NULL
while(iter + step_size < ncol(m)){
print(iter)
add_output = data.frame(as.matrix(m[,iter:(iter+step_size-1)]))
if(is.null(output)){
output = add_output
}else{
output = cbind(output,add_output)
}
iter = iter + step_size
}
add_output = data.frame(as.matrix(m[,iter:ncol(m)]))
output = cbind(output,add_output)
return (output)
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.