IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

comparaison de données dans une boucle


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Par défaut comparaison de données dans une boucle
    Bonjour,

    Voici mon petit soucis. J'utilise actuellement une boucle dans une fonction afin d'identifier des valeurs comme fausses. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    out2NA <- function(x,seuil){
        st1 = NULL
        # Variable temporaire mémorisant la dernière valeur "correcte" relevée #
        temp <- st1[1] <- x[1]
        # Conserver l'indice de la valeur tampon #
        ind_temp <- 1
        # Définir ecart_temps max entre 2 comparaisons #
        ecart_temps <- 15
        # Conserver les temps de chaque élément de la série temporelle #
        tps <- time(x)   
     
        # Suppression des valeurs absolues dont l'écart avec la précédente est >= au seuil défini
        # et suppression des valeurs suivantes si la valeur aberrante se répète #
        for (i in 2:length(x)){
        if((!is.na(x[i])){
        if((tps[i]-tps[ind_temp] < ecart_temps) & (abs(x[i]-temp) > seuil)){  
        st1[i] <- NA
        }
        else {    
        temp <- st1[i] <- x[i]
        ind_temp <- i
        }
        }    
        }
     
        return(st1)
        }
    Pour l'instant, il fonctionne bien ainsi. Il compare la valeur x[i] avec la valeur temporaire mémorisée, et regarde si l'écart temporel entre les 2 données n'est pas trop important. Mais comme il ne détecte pas tout à fait ce que je veux, j'aimerais lui rajouter une condition supplémentaire dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((tps[i]-tps[ind_temp] < ecart_temps) & (abs(x[i]-temp) > seuil)  
        &(abs(x[i+1]-x[i])<1)){
    Il ferait donc la même chose qu'avant, mais avec en plus une comparaison entre la valeur x[i] et la valeur qui la suit juste derrière x[i+1].

    En testant ainsi, j'ai la réponse: "valeur manquante là où true/false est requis".
    Je rajoute donc dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((!is.na(x[i])&(!is.na(x[i+1])){
    et si je teste à nouveau, j'ai l'erreur suivante: "le nombre d'objets à remplacer n'est pas multiple de la taille du remplacement "

    J'ai donc essayé en changeant length(x) ou en utilisant dim(x), pensant que c'est le x[i+1] qui pose problème pour le calcul (et donc un problème de longueur du vecteur pour les comparaisons), mais je n'arrive pas pour l'instant.
    Quelqu'un pourrait-il m'aider?
    Merci d'avance!

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Je n'ai pas trop le temps de me plonger dans votre code mais à première vue comme ça, le problème n'apparaît-il pas lorsque i=length(x) ? En effet, à ce stade vous allez faire un test sur x[i+1] qui n'existe pas.

    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Par défaut
    Re-bonjour,

    Merci à votre tour pour votre réponse. En effet c'est fort possible. J'ai effectivement essayé de jouer sur le paramètre length(x) dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i in 2:length(x)){
    En essayant notamment de remplacer length(x) par: length(x)+1, ou bien de remplacer: 2:length(x) (en sachant que le nombre total de lignes est 35100) par: 2:35101, mais ça ne fonctionne pas. Et puis faire encore un: "for i+1 in..." est encore moins possible.
    Comment faire dans ce cas justement pour que le x[i+1] existe et soit accepté?

  4. #4
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Le fait de faire aller i jusqu'à length(x)+1 ne va pas résoudre le problème, bien au contraire, puisque vous aurez en plus une étape (lorsque i = length(x)+1 ) où ni x[i] ni x[i+1] n'existent...
    Je ne suis pas trop rentrée dans votre algorithme, mais à quoi sert le test sur la valeur x[i+1]?

    Une solution ici est d'arrêter la boucle à i = length(x) - 1, et de faire le dernier calcul (sur lequel vous n'effectuerez pas de test sur x[i+1]) à part (après la boucle).

    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/04/2010, 11h24
  2. Réponses: 7
    Dernier message: 09/03/2010, 09h23
  3. [MySQL] concaténer des données dans une boucle recursive
    Par stily dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/01/2009, 22h45
  4. [MySQL] Récupération de données dans une boucle
    Par Rodinrott dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 04/11/2008, 10h15
  5. Réponses: 2
    Dernier message: 06/02/2007, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo