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")