15 Stimmen

Erstellen (und Zugriff auf) einer dünn besetzten Matrix mit Standardwerten NA

Nachdem ich über die Optionen zum Arbeiten mit dünn besetzten Matrizen in R gelernt habe, möchte ich das Matrix-Paket verwenden, um aus dem folgenden Datenrahmen eine dünn besetzte Matrix zu erstellen und alle anderen Elemente als NA zu haben.

     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ß, dass ich eine dünn besetzte Matrix mit folgendem erstellen kann und auf Elemente wie üblich zugreifen kann:

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

Wenn ich jedoch den Standardwert auf NA setzen möchte, habe ich Folgendes versucht:

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

und habe diesen Fehler erhalten:

Fehler bei checkSlotAssignment(object, name, value) : 
  Zuweisen eines Objekts der Klasse "numeric" für den Slot "x" in einem Objekt der Klasse "lgCMatrix" ist nicht gültig; is(value, "logical") ist nicht TRUE

Nicht nur das, ich finde auch, dass es viel länger dauert, auf die Elemente zuzugreifen.

> 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 sollte ich diese Matrix erstellen? Warum ist eine Matrix so viel langsamer zu bearbeiten?

Hier ist der Codeausschnitt 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")

16voto

Thierry Punkte 17544

Warum möchtest du Standard-NA-Werte haben? Soweit ich weiß, sind Matrizen nur dünn besetzt, wenn sie Nullzellen haben. Da NA einen Nicht-Null-Wert ist, verlierst du alle Vorteile der dünn besetzten Matrix. Eine klassische Matrix ist sogar effizienter, wenn die Matrix kaum Nullen hat. Eine klassische Matrix ist wie ein Vektor, der entsprechend den Dimensionen zugeschnitten wird. Sie muss also nur den Datenvektor und die Dimensionen speichern. Die dünn besetzte Matrix speichert nur die Nicht-Null-Werte, speichert aber auch deren Position. Dies ist ein Vorteil, wenn und nur wenn du genügend Nullwerte hast.

12voto

Martin Mächler Punkte 4344

Ja, Thierrys Antwort ist definitiv wahr, wie ich als Co-Autor des 'Matrix'-Pakets sagen kann...

Zu Ihrer anderen Frage: Warum ist der Zugriff auf "M" langsamer als auf "Y"? Die Hauptantwort ist, dass "M" wesentlich spärlicher ist als "Y" und daher viel kleiner ist und - abhängig von den beteiligten Größen und dem RAM Ihrer Plattform - die Zugriffszeit für viel kleinere Objekte schneller ist, insbesondere zum Indizieren in diese hinein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X