7
votes

Écrivez une matrice clairsemée à un CSV dans R

J'ai une matrice rare ( dgcmatrix ) à la suite de l'ajustement d'un GLMNET . Je veux écrire ce résultat à un .csv mais je ne peux pas utiliser write.table () la matrice car il ne peut pas contraindre à un data.frame .

Y a-t-il un moyen de contraindre la matrice clairsemée à un data.frame ou une matrice régulière? Ou existe-t-il un moyen de l'écrire dans un fichier tout en conservant les noms de coefficients qui sont probablement des noms de ligne?


0 commentaires

4 Réponses :


7
votes

as.matrix () sera converti en la représentation dense complète: xxx

Vous pouvez écrire l'objet résultant en utilisant write.csv ou write.table .


1 commentaires

J'ai essayé matrix () et ça n'a pas fonctionné, je ne pensais pas essayer comme.matrix (). Merci pour l'aide.



13
votes

qui sera dangereux de transformer la matrice clairsemée en une normale, si la taille de matrice clause est trop grande. Dans mon cas (tâche de classification de texte), j'ai eu une matrice de taille 22490 de 120 000. Si vous essayez d'obtenir la matrice dense, cela sera supérieur à 20 Go, je pense. Alors r va tomber en panne!

Donc, ma suggestion, vous pouvez simplement stocker la matrice rare d'une manière efficace et conviviale, telle que Format de marché Matrix , qui conserve toutes les valeurs non nulles et leurs coordonnées (rangée et numéro de col). Dans le R, vous pouvez utiliser la méthode Writemm


0 commentaires

4
votes
> library(Matrix)
> dn <- list(LETTERS[1:3], letters[1:5])
> m <- sparseMatrix(i = c(3,1,3,2,2,1), p= c(0:2, 4,4,6), x = 1:6, dimnames = dn)

> m
3 x 5 sparse Matrix of class "dgCMatrix"
  a b c d e
A . 2 . . 6
B . . 4 . 5
C 1 . 3 . .

> sparse2triples(m)
  row col x
1   C   a 1
2   A   b 2
3   B   c 4
4   C   c 3
5   A   e 6
6   B   e 5 

2 commentaires

Veuillez ajouter une explication car ce sera plus facile à comprendre


Cela a fonctionné pour moi (qui a été pris de votre réponse) SM = Résumé (MAT0) D1 = NROW (MAT0) D2 = NROW (MAT0) A <-AS.Matrix (Data.Frame (rangée = D1, col = D2, X = Sm))



6
votes

La conversion directement en une matrice dense est susceptible de perdre beaucoup de mémoire. La matrice de package R permet de convertir la matrice clairsemée en une trame de données de format de triplet de coordonnées de coordonnées en mémoire à l'aide de la fonction Résumé () code>, qui pourrait ensuite être écrite facilement sur CSV. Ceci est probablement plus simple et plus facile que l'approche du marché matricielle. Voir la réponse à cette question connexe: Matrice raffinée à un Cadre de données dans R

En outre, voici une illustration du Documentation de package Matrix : p>

## very simple export - in triplet format - to text file:
data(CAex)
s.CA <- summary(CAex)
s.CA # shows  (i, j, x)  [columns of a data frame]
message("writing to ", outf <- tempfile())
write.table(s.CA, file = outf, row.names=FALSE)
## and read it back -- showing off  sparseMatrix():
str(dd <- read.table(outf, header=TRUE))
## has columns (i, j, x) -> we can use via do.call() as arguments to sparseMatrix():
mm <- do.call(sparseMatrix, dd)
stopifnot(all.equal(mm, CAex, tolerance=1e-15))


0 commentaires