2009-08-13 22 views
11

Po zapoznaniu się z options for working with sparse matrices in R, chcę użyć pakietu Matrix, aby utworzyć rzadką macierz z poniższej ramki danych i wszystkie inne elementy mają być NA.Tworzenie (i uzyskiwanie dostępu) rzadkiej macierzy z domyślnymi pozycjami 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 

wiem, że mogę stworzyć rzadki matrycy jest następujący, dostęp do elementów jak zwykle:

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

ale jeśli chcę mieć wartość domyślną, aby oznaczać Na starałem następujące:

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

i dostał ten błąd

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 

Nie tylko to, uważam, że dostęp do elementów jest znacznie dłuższy.

> 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 

Jak powinienem tworzyć tę macierz? Dlaczego jedna matryca wolniej pracuje?

Oto fragment kodu dla powyższych danych:

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

Odpowiedz

12

Tak, odpowiedź Thierry jest zdecydowanie prawdziwe mogę powiedzieć, jako współautor pakietu „Matrix” ...

na inne pytanie: dlaczego uzyskującego dostęp do „M” wolniejszy niż „Y”? Główną odpowiedzią jest to, że "M" jest o wiele rzadsze niż "Y", a więc o wiele mniejsze i - zależnie od rozmiarów envolved i RAM platformy - czas dostępu jest szybszy dla dużo mniejszych obiektów, w szczególności dla indeksowania im.

+0

Dzięki! Czekam na więcej Twoich odpowiedzi na StackOverflow. Spróbuję pobudzić niektóre z pytań, które miałem podczas korzystania z Matrix ... –

+10

To niefortunne, że wszystkie niezerowe komórki są zawsze przechowywane. Byłoby miło móc określić domyślną wartość różną od zera dla sparseMatrix. – Quantum7

+1

Zastanawiam się, czy istnieje domyślna wartość dla sparseMatrix? – hs3180

15

Dlaczego chcesz wartości domyślnych nA? O ile mi wiadomo, macierze są tylko nieliczne, jeśli mają komórki zerowe. Ponieważ NA jest niezerową wartością, tracisz wszystkie zalety rzadkiej macierzy. Klasyczna macierz jest jeszcze bardziej wydajna, jeśli macierz nie ma prawie zer. Klasyczna matryca jest jak wektor, który będzie cięty zgodnie z wymiarami. Musi więc tylko przechowywać wektor danych i wymiary. Matryca rozrzedzona przechowuje tylko wartości niezerowe, ale także przechowuje tam lokalizację. Jest to zaletą wtedy i tylko wtedy, gdy masz wystarczającą liczbę zer.

+0

Tak, przypuszczam, że to prawda. –

+1

Ale jeśli moja "domyślna" wartość to 1, to z pewnością masz tylko 1 dodatkowy bit do przechowywania informacji, to znaczy, że domyślnie jest 1 zamiast przyjmować 0. Wciąż przechowuję wartości "różne od domyślnych" tak jak w 0. przykład, ale założenie jest znacznie bardziej ogólne. – adunaic

+1

"Jest to zaleta wtedy i tylko wtedy, gdy masz wystarczającą liczbę zer.": Po prostu nieprawda. Zastąp każde wystąpienie "zera" w swoim komentarzu "jednym" lub innym numerem, a zobaczysz, że twoje zdanie nadal trwa. Używanie zera jest zgodne z konwencją i istnieje wiele aplikacji, w których warto mieć domyślne wartości inne niż zero. Pod względem oszczędności pamięci warto ustawić wartość domyślną na liczbę, która najczęściej występuje w zestawie danych. – derwiwie