72 votes

Le moyen le plus rapide de détecter si le vecteur a au moins 1 NA ?

Quel est le moyen le plus rapide de détecter si un vecteur a au moins 1 NA dans R ? J'ai utilisé :

 sum( is.na( data ) ) > 0

Mais cela nécessite d'examiner chaque élément, la coercition et la fonction somme.

73voto

Sacha Epskamp Points 14956

Je pense:

 any(is.na(data))

devrait être légèrement plus rapide.

8voto

EDi Points 6038

On pourrait écrire une boucle for s'arrêtant à NA, mais le temps système dépend alors de l'endroit où se trouve le NA... (s'il n'y en a pas, cela prend beaucoup de temps)

 set.seed(1234)
x <- sample(c(1:5, NA), 100000000, replace = TRUE)

nacount <- function(x){
  for(i in 1:length(x)){
    if(is.na(x[i])) {
      print(TRUE)
      break}
}}

system.time(
  nacount(x)
)
[1] TRUE
       User      System verstrichen 
       0.14        0.04        0.18 

system.time(
  any(is.na(x))
) 
       User      System verstrichen 
       0.28        0.08        0.37 

system.time(
  sum(is.na(x)) > 0
)
       User      System verstrichen 
       0.45        0.07        0.53 

6voto

joran Points 68079

Voici quelques heures réelles de ma machine (lente) pour certaines des différentes méthodes discutées jusqu'à présent :

 x <- runif(1e7)
x[1e4] <- NA

system.time(sum(is.na(x)) > 0)
> system.time(sum(is.na(x)) > 0)
   user  system elapsed 
  0.065   0.001   0.065 

system.time(any(is.na(x)))  
> system.time(any(is.na(x)))
   user  system elapsed 
  0.035   0.000   0.034

system.time(match(NA,x)) 
> system.time(match(NA,x))
  user  system elapsed 
 1.824   0.112   1.918

system.time(NA %in% x) 
> system.time(NA %in% x)
  user  system elapsed 
 1.828   0.115   1.925 

system.time(which(is.na(x) == TRUE))
> system.time(which(is.na(x) == TRUE))
  user  system elapsed 
 0.099   0.029   0.127

Il n'est pas surprenant que match et %in% soient similaires, puisque %in% est implémenté en utilisant match .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X