Question

Après avoir appris les pour travailler avec des matrices creuses en R , je veux utiliser le package Matrice pour créer un matrice creuse à partir de la trame de données suivante et tous les autres éléments sont soit NA.

     s    r d
1 1089 3772 1
2 1109  190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109   38 7

Je sais que je peux créer une matrice creuse avec ce qui suit, l'accès aux éléments, comme d'habitude:

> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0

mais si je veux avoir la valeur par défaut pour être NA, j'ai essayé ce qui suit:

  M <- Matrix(NA,max(s),max(r),sparse=TRUE)
  for (i in 1:nrow(X))
    M[s[i],r[i]] <- d[i]

et a obtenu cette erreur

Error in checkSlotAssignment(object, name, value) : 
  assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE

Non seulement cela, je trouve que l'on prend beaucoup plus de temps pour l'accès aux éléments.

> system.time(Y[3,3])
   user  system elapsed 
  0.000   0.000   0.003 
> system.time(M[3,3])
   user  system elapsed 
  0.660   0.032   0.995 

Comment dois-je en train de créer cette matrice? Pourquoi est une matrice tellement plus lent à travailler?

Voici l'extrait de code pour les données ci-dessus:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame")
Était-ce utile?

La solution

Oui, la réponse de Thierry est certainement vrai que je peux dire en tant que co-auteur du paquet « Matrix » ...

Pour votre autre question: Pourquoi l'accès à « M » plus lent que « Y »? La principale réponse est que « M » est beaucoup plus clairsemé que « Y », d'où beaucoup plus petit et - en fonction des tailles et envolved la RAM de votre plate-forme - le temps d'accès est plus rapide pour les objets beaucoup plus petits, notamment pour l'indexation en les .

Autres conseils

Pourquoi voulez-vous les valeurs par défaut NA? Pour autant que je sais que les matrices sont rares si elles ont des cellules nulles. Comme NA est une valeur non nulle, vous perdez tous les avantages de la matrice clairsemée. Une matrice classique est encore plus efficace si la matrice a pratiquement pas de zéros. Une matrice classique est comme un vecteur qui sera coupée en fonction des dimensions. Donc, il n'a qu'à stocker le vecteur de données et les dimensions. Les magasins de la matrice clairsemés seules les valeurs non nulles, mais stocke également là emplacement. Ceci est un avantage si et seulement si vous avez suffisamment de valeurs zéro.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top