Erstellen (und Zugriff) eine Sparse Matrix mit NA Standardeinträgen
-
16-09-2019 - |
Frage
Nach dem Lernen über die Optionen für die mit spärlichen Matrizen in R Arbeits , ich mag das Matrix Paket verwenden, eine erstellen sparse-Matrix aus dem folgenden Datenrahmen und haben alle andere Elemente NA
werden.
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
Ich weiß, ich kann eine spärliche Matrix mit dem folgenden erstellen, Elementen wie gewohnt Zugriff auf:
> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0
aber wenn ich den Standardwert sein NA haben wollen, habe ich versucht, die folgenden:
M <- Matrix(NA,max(s),max(r),sparse=TRUE)
for (i in 1:nrow(X))
M[s[i],r[i]] <- d[i]
und bekam diesen Fehler
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
Nicht nur das, finde ich, dass man viel mehr Elemente Zugriff nimmt.
> 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
Wie soll ich diese Matrix erschaffen? Warum ist eine Matrix so viel langsamer, mit zu arbeiten?
Hier ist der Code-Schnipsel für die obigen Daten:
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")
Lösung
Ja, Antwort Thierry ist definitiv wahr, dass ich als Co-Autor des ‚Matrix‘ Pakets sagen kann ...
Um Ihre andere Frage: Warum ist „M“ langsamer als „Y“ zugreifen? Die wichtigste Antwort ist, dass „M“ ist viel viel spärlicher als „Y“ daher viel kleiner und - je nach envolved Größen und der RAM Ihrer Plattform - die Zugriffszeit schneller für viel kleinere Objekte, insbesondere für die Indizierung in sie .
Andere Tipps
Warum wollen Sie NA-Werte Standard? Soweit ich weiß, Matrizen sind nur spärlich, wenn sie Null-Zellen haben. Wie NA ein Wert ungleich Null ist, verlieren Sie alle Vorteile aus der Sparse Matrix. Eine klassische Matrix ist noch effizienter, wenn die Matrix kaum Nullen hat. Eine klassische Matrix ist wie ein Vektor, der entsprechend den Abmessungen geschnitten wird. So hat es nur den Datenvektor und die Abmessungen zu speichern. Die Sparse Matrix speichert nur die Nicht-Null-Werte, sondern auch speichert dort Lage. Dies ist ein Vorteil, wenn und nur wenn man genug Nullwerte hat.