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.
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.
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
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 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.