Vraag Beste manier om matrix toe te wijzen in R, NULL vs NA?


Ik schrijf R-code om een ​​vierkante matrix te maken. Dus mijn aanpak is:

  1. Wijs een matrix van de juiste grootte toe
  2. Doorloop elk element van mijn matrix en vul het met een geschikte waarde

Mijn vraag is heel simpel: wat is de beste manier om deze matrix vooraf toe te wijzen? Tot nu toe heb ik twee manieren:

> x <- matrix(data=NA,nrow=3,ncol=3)
> x
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
[3,]   NA   NA   NA

of

> x <- list()
> length(x) <- 3^2
> dim(x) <- c(3,3)
> x
     [,1] [,2] [,3]
[1,] NULL NULL NULL
[2,] NULL NULL NULL
[3,] NULL NULL NULL

Voor zover ik kan zien, is de eerste een meer beknopte methode dan de laatste. Ook vult de eerste de matrix met NA's, terwijl de laatste is gevuld met NULLEN.

Welke is de "betere" manier om dit te doen? In dit geval definieer ik "beter" als "betere prestaties", omdat dit statistische gegevens is en deze bewerking zal plaatsvinden met grote gegevensreeksen.

Terwijl de eerste meer beknopt is, is het niet adembenemend gemakkelijker te begrijpen, dus ik denk dat dit in beide richtingen kan gaan.

Wat is het verschil tussen NA en NULL in R? ? NA en? NULL vertellen mij dat "NA" een lengte heeft van "1" terwijl NULL een lengte van "0" heeft - maar is er meer hier? Of een best practice? Dit is van invloed op de methode die ik gebruik om mijn matrix te maken.


32
2017-11-16 23:44


oorsprong


antwoorden:


Test jezelf als je twijfelt. De eerste aanpak is zowel eenvoudiger als sneller.

> create.matrix <- function(size) {
+ x <- matrix()
+ length(x) <- size^2
+ dim(x) <- c(size,size)
+ x
+ }
> 
> system.time(x <- matrix(data=NA,nrow=10000,ncol=10000))
   user  system elapsed 
   4.59    0.23    4.84 
> system.time(y <- create.matrix(size=10000))
   user  system elapsed 
   0.59    0.97   15.81 
> identical(x,y)
[1] TRUE

Wat betreft het verschil tussen NA en NULL:

Er zijn eigenlijk vier speciale constanten.

Bovendien zijn er vier speciale constanten, NULL, NA, Inf en NaN.

NULL wordt gebruikt om het lege object aan te geven. NA wordt gebruikt voor afwezige ("niet beschikbaar") gegevenswaarden. Inf staat voor oneindig en NaN is niet-een getal in de IEEE floating point calculus (resultaten van de bewerkingen respectievelijk 1/0 en 0/0, bijvoorbeeld).

U kunt meer lezen in de R-handleiding over taaldefinitie.


44
2017-11-16 23:58



Volgens Dit artikel we kunnen het beter doen dan vooraf toewijzen met NA door vooraf toe te wijzen met NA_real_. Uit het artikel:

Zodra u een numerieke waarde toewijst aan een van de cellen in 'x', moet de matrix eerst worden afgedwongen tot numeriek wanneer een nieuwe waarde wordt toegewezen. De oorspronkelijk toegewezen logische matrix is ​​tevergeefs toegewezen en voegt gewoon een onnodige geheugenvoetafdruk en extra werk voor de vuilnisman toe.   Inplaats daarvan toewijzen met NA_real_ (of NA_integer_ voor gehele getallen)

Zoals aanbevolen: laten we het testen.

testfloat = function(mat){
  n=nrow(mat)
  for(i in 1:n){
    mat[i,] = 1.2
  }
}

>system.time(testfloat(matrix(data=NA,nrow=1e4,ncol=1e4)))
user  system elapsed 
3.08    0.24    3.32 
> system.time(testfloat(matrix(data=NA_real_,nrow=1e4,ncol=1e4)))
user  system elapsed 
2.91    0.23    3.14 

En voor gehele getallen:

testint = function(mat){
  n=nrow(mat)
  for(i in 1:n){
    mat[i,] = 3
  }
}

> system.time(testint(matrix(data=NA,nrow=1e4,ncol=1e4)))
user  system elapsed 
2.96    0.29    3.31 
> system.time(testint(matrix(data=NA_integer_,nrow=1e4,ncol=1e4)))
user  system elapsed 
2.92    0.35    3.28 

Het verschil is klein in mijn testgevallen, maar het is er.


4
2017-11-03 22:27



rows<-3
cols<-3    
x<-rep(NA, rows*cols)
x1 <- matrix(x,nrow=rows,ncol=cols)

0
2018-04-13 14:52