Débutant: dénombrement des séquences de non NA

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

William Denault
Messages : 6
Enregistré le : 07 Mai 2015, 11:58

Débutant: dénombrement des séquences de non NA

Messagepar William Denault » 08 Juin 2015, 11:59

Bonjour,

Je suis encore peu expérimenté en R et je butte sur le problème suivant.
J'ai un vecteur de connexions/min, je l'ai écrêté pour ne garder que les "pics" de connexions ( j'ai brutalement remplacé les valeurs inférieures à mon seuil par des NA). Mon problème est le suivant, je souhaite connaitre le nombre de pics afin d'obtenir la durée moyenne de ces pics. C'est à dire compter le nombre séquences de non NA.
Y a t-il une fonction sous R qui permet de faire cela simplement?

Merci d'avance de vos conseils.

Bien cordialement
William

Gabriel Terraz
Messages : 592
Enregistré le : 26 Sep 2011, 15:11

Re: Débutant: dénombrement des séquences de non NA

Messagepar Gabriel Terraz » 08 Juin 2015, 12:16

Salut,

Si tu veux compter des NA dans un vecteur :

Code : Tout sélectionner

sum(is.na(tonvecteur))


et l'inverse :

Code : Tout sélectionner

sum(!is.na(tonvecteur))


Edit :

Je crois en fait que ta question était sur les suites de NA :

Code : Tout sélectionner

v <- c(42,45,NA,12,15,NA,12,45,23,89,NA,NA,56,89,7)
rl <- rle(!is.na(v))
> rl
Run Length Encoding
  lengths: int [1:7] 2 1 2 1 4 2 3
  values : logi [1:7] TRUE FALSE TRUE FALSE TRUE FALSE ...
 
sum(rl$values)
[1] 4


Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Débutant: dénombrement des séquences de non NA

Messagepar Serge Rapenne » 08 Juin 2015, 12:33

Bonjour,

pour compter les séquences, il y a la fonction rle. Par exemple

Code : Tout sélectionner

data<-data<-c(1,1,2,3,3,3,5,1,NA,2,2)
compte_seq<-rle(data)

compte_seq$lengths
[1] 2 1 3 1 1 1 2
compte_seq$values
[1] 1 2 3 5 1 NA 2


Serge

Edit : Grillé

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Débutant: dénombrement des séquences de non NA

Messagepar Navarre Julien » 08 Juin 2015, 12:45

Bonjour,

si tu as un vecteur d'objets numériques , tu peux compter les valeurs différentes de NA de plusieurs façons :

Code : Tout sélectionner

pics <- c(NA, 100, 200, NA)

sum(!is.na(pics), na.rm = TRUE)

length(pics[!is.na(pics)])


Dans la première ligne !is.na permet de demander quelles valeurs ne sont pas égales à NA (avec l'opérateur unaire not "!")

Code : Tout sélectionner

> !is.na(pics)
[1] FALSE  TRUE  TRUE FALSE


R te renvoi un vecteur de booléens (logicals), vrai ou faux, qui répondent à la question. Tu peux ensuite compter le nombre de TRUE avec la fonction de somme "sum" car les booléens sont convertis en des entiers dans les situations où une valeur numérique est nécessaire, ainsi TRUE est évalué comme 1 et FALSE comme 0 (> TRUE == 1[1] TRUE > FALSE == 0 [1] TRUE ==> ?sum ?logical). On utilise le paramètre na.rm pour ignorer les NA si jamais il y en a dans le vecteur !is.na(pics).

Je te laisse inspecter la 2ème :)

Mais si tu veux juste faire une moyenne tu n'es pas obligé de la calculer manuellement, R possède déjà une fonction qui le fait : mean

Code : Tout sélectionner

mean(pics)
[1] NA
mean(pics, na.rm = TRUE)
[1] 150


Il faut utiliser l'argument na.rm pour que les valeurs NA soient, rm pour removed, enlevées du vecteur pour le calcul. Car comme tu peux le constater les calculs avec des NA produit des NA : ">NA + 1 [1] NA"

Deux choses importantes :
Pour comparer une valeur à NA tu dois obligatoirement utiliser is.na, tu ne peux pas utiliser l'opérateur "==".
et attention "NA" est différent de NA.

Code : Tout sélectionner

> NA == NA
[1] NA
> is.na(NA)
[1] TRUE
> is.na("NA")
[1] FALSE
> pics <- c("NA", 100, 200, "NA")
> sum(!is.na(pics), na.rm = TRUE)
[1] 4


Bon courage

William Denault
Messages : 6
Enregistré le : 07 Mai 2015, 11:58

Re: Débutant: dénombrement des séquences de non NA

Messagepar William Denault » 09 Juin 2015, 12:23

Merci pour vos réponses, en effet la fonction rle est utile dans ce cas.
Bien cordialement
William


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité