Pergunta

Depois de aprender sobre a para trabalhar com matrizes esparsas em R , eu quero usar o pacote Matrix para criar uma matriz esparsa do seguinte quadro de dados e tem todos os outros elementos ser 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

Eu sei que posso criar uma matriz esparsa com o seguinte, acessando elementos, como de costume:

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

mas se eu quero ter o valor padrão a ser NA, eu tentei o seguinte:

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

e tenho esse erro

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

Não só isso, eu acho que se leva muito mais tempo para o acesso a elementos.

> 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 

Como eu deveria estar criando essa matriz? Por que é uma matriz de modo muito mais lento para trabalhar com?

Aqui está o trecho de código para os dados acima:

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")
Foi útil?

Solução

Sim, a resposta de Thierry é definitivamente verdadeiro que posso dizer como co-autor do pacote do 'Matrix' ...

Para sua outra pergunta: Por que está acessando "M" mais lenta do que "Y"? A resposta principal é que "M" é muito, muito mais escassos do que "Y", portanto, muito menor e - dependendo dos tamanhos envolvido ea RAM de sua plataforma - o tempo de acesso é mais rápido para objetos muito menores, nomeadamente para a indexação para eles .

Outras dicas

Por que você quer usar como padrão valores de NA? Tanto quanto eu sei matrizes são apenas escassa se eles têm zero-células. Como NA é um valor diferente de zero, você perde todos os benefícios da matriz esparsa. Uma matriz clássico é ainda mais eficaz se a matriz não tem praticamente nenhum zeros. Uma matriz clássico é como um vector que vai ser cortada de acordo com as dimensões. Por isso, só tem de armazenar o vetor de dados e as dimensões. As lojas de matriz esparsos apenas os valores diferentes de zero, mas também armazena lá localização. Esta é uma vantagem se e somente se você tem valores suficientes de zero.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top