Domanda

Dopo aver appreso la per lavorare con matrici sparse in R , voglio usare il pacchetto Matrix per creare un matrice sparsa dalla seguente frame di dati e hanno tutti gli altri elementi essere 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

So di poter creare una matrice sparsa con la seguente, accedendo elementi come al solito:

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

, ma se voglio avere il valore di default di essere NA, ho provato quanto segue:

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

e ottenuto questo errore

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 solo, trovo che si prende molto più tempo per l'accesso agli elementi.

> 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 

Come dovrei essere la creazione di questa matrice? Perchè è una matrice, in modo molto più lento di lavorare con?

Ecco il frammento di codice per i dati di cui sopra:

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")
È stato utile?

Soluzione

Sì, la risposta di Thierry è sicuramente vero che posso dire come co-autore del pacchetto di 'Matrix' ...

Per la tua altra domanda: Perché l'accesso a "M" più lento di "Y"? La risposta principale è che "M" è molto molto rada di "Y", quindi molto più piccola e - a seconda delle dimensioni envolved e la RAM della piattaforma - il tempo di accesso è più veloce di oggetti molto più piccoli, in particolare per l'indicizzazione in loro .

Altri suggerimenti

Perché vuoi difetto valori NA? Per quanto ne so matrici sono sparse solo se hanno zero-cellule. Come NA è un valore diverso da zero, si perdono tutti i benefici dalla matrice sparsa. Una matrice classico è ancora più efficace se la matrice ha quasi nessun zeri. Una matrice classica è come un vettore che verrà tagliato secondo le dimensioni. Così ha solo per memorizzare il vettore di dati e le dimensioni. I negozi matrici sparse solo i valori diversi da zero, ma memorizza anche là posizione. Questo è un vantaggio se e solo se avete abbastanza valori pari a zero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top