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 :

Boucle for()


Sujet :

R

  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut Boucle for()
    Bonjour,

    Je souhaite effectuer une opération pour tous les niveaux d'une de mes variables (PARAMETER) sauf un seul car il n'a aucune valeur, ie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i in 1:nlevels(PARAMETER)
    mais je voudrais pas qu'il le fasse pour PARAMETER==Param_24 (exemple)

    Comment puis je faire ?

    Cdlt

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    j<-grep("Param_24",PARAMETER)
     
    for(i in 1:nlevels(PARAMETER)[-j])
    Manoir

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    En fait je vais rectifier un peu ma question:

    j'ai une matrice de taille nxp, avec pour ligne un numero de lot, pour colonne un nom de paramètre et a l'interieur des valeurs.

    Il se trouve que pour une colonne (pour un parametre quelconque) toutes les valeurs sont à NA.

    Je souhaiterais donc d'une part supprimer la colonne en question et d'autre part pouvoir récuperer le nom de la colonne (nom du paramètre)

    Voila c'est plus clair

    Merci de votre aide

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    Je te propose de faire tourner ça pour récupérer les noms de colonnes NA dans ta matrice.
    sansNA<-na.omit(as.data.frame(t(MAT))) # Utiliser as.data.frame, si MAT est une matrice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MATFINAL<-t(sansNA) # matrice sans les colonnes NA
     
    setdiff(colnames(as.data.frame(MAT)),rownames(sansNA)) # récupérer les noms de tes colonnes NA
    J'espère que cela répond à ta question
    Manoir

  5. #5
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Manoir, 2 gros problèmes:

    - ça me supprime même les colonnes qui n'ont qu'un seule NA, moi je voudrais que ça me supprime les colonnes qui n'ont que des NA sur toutes les lignes

    - la matrice sansNa est la transposée de celle que j'avais (parametre en ligne et lot en colonne)


    ??

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    Je suis d'accord avec le 1 problème, mais ce que t'intéresse est MATFINAL toi et pas sansNA.

    j'ai fait un petit code plus simple je pense

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fun<-function(x){
     y<-(sum(is.na(x))==length(x))
    }                           # fonction pour déterminer les colonnes manquantes
    indicNA<-which(apply(Mat,2,fun)==TRUE) # récupérer les indices de colonnes manquantes
     
    Matfinale<-Mat[,-indicNA]  # Matrice sans les colonnes manquantes
    ça devrait aller mnt nn ?

    Manoir

  7. #7
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Manoir, c'est nickel pour Matfinale, j'ai bien une matrice sans la colonne des NA, par contre pour récuperer le nom de la colonne ça ne fonctionne pas

    ??

  8. #8
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Ok c'est bon j'ai trouvé

  9. #9
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Voici donc ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fun=function(x){
    k=(sum(is.na(x)==length(x))}
    indicNA=which(apply(matrice2,2,fun)==TRUE)
    MatriceFinale2=matrice2[,-indicNA]      ## Permet d'avoir une matrice sans colonne remplie de NA
     
    sansNA=t(MatriceFinale2)
    t=setdiff(colnames(as.data.frame(matrice2)),rownames(sansNA)) ## récupere le nom des colonnes sans celle que l'on a supprimé
     
    q=grep(t,levels(Data_Base$PARAMETER))
    for(i in 1:length(levels(Data_Base$PARAMETER)[-q]))] ## effectue une boucle sur tous les paramètres sauf celui ou la colonne a été supprimé

    Il s'avère que ce code fonctionne correctement lorsqu'il existe une telle matrice ayant au moins une colonne remplie de NA, mais lorsque ma matrice n'en possède pas ça ne marche plus ...

    Comment puis-je rendre ce code généralisable ?

    Merci

  10. #10
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    En fait, le problème vient de indicNA qui renvoie named integer(0) lorsqu'il n'y a aucune colonne possédant que des NA.

    Du coup le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MatriceFinale2=matrice2[,-indicNA]
    ne marche pas ...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    Re,

    Une parenthèse est mal placée dans ta fonction fun, et plus précisément dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     k=(sum(is.na(x)==length(x))
    Pour généraliser le code je te suggère de faire tourner ce script, qui enlève les colonnes manquantes entière si il en trouve, sinon il garde la matrice initiale!

    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
    fun<-function(Matrice){
    x<-which(apply(Matrice,2,function(x){k<-sum(is.na(x))==length(x)})==TRUE)
    if(length(x)!=0)
    {
    MatriceFinale2<-Matrice[,-x]
    }
    else 
    {
    MatriceFinale2<-Matrice
    }
    MatriceFinale2
    }
     
     
    fun(Matrice)

    Bien à toi
    Manoir

  12. #12
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Manoir, ça ne fonctionne pas, ça me renvoie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur: objet 'MatriceFinale2' introuvable
    ??

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    bonjour,

    ça fonctionne très bien avec l'exemple que j'ai pris, t'as bien mis dans la fonction fun ta matrice d'entrée? MatriceFinale2<-Matrice
    on affecte la matrice Matrice à MatriceFinal2, donc le problème et dans Matrice, faut essayer de compiler le script ligne par ligne pour voir ?

    Bien à toi

  14. #14
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Ma matrice s'appelle matrice2, j'ai donc tapé la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fun=function(matrice2){
    w=which(apply(matrice2,2,function(w){k=sum(is.na(w))==length(w)})==TRUE)
        if(length(w) !=0){
        MatriceFinale2=matrice2[,-w]
        }
        else{
        MatriceFinale2=matrice2
        }
    MatriceFinale2
    }

    Mais MatriceFinale2 et w sont introuvables ...

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    Re,

    Je crois savoir la réponse, en fait dans la fonction fun(paramètre par défaut)

    quand tu fais appel à ta fonction, là tu mets ta matrice :, mais pas ds la définition de ta fonction!

    copie-coller ce code sans rien changer et dis moi si ça marche ou pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fun=function(Toto){
    w=which(apply(Toto,2,function(w){k=sum(is.na(w))==length(w)})==TRUE)
        if(length(w) !=0){
        MatriceFinale2=Toto[,-w]
        }
        else{
        MatriceFinale2=Toto
        }
    MatriceFinale2
    }
     
    fun(matrice2)

  16. #16
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Oui c'est bon ça fonctionne, merci

    Maintenant le dernier problème est pour cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sansNA=t(MatriceFinale2)
    t=setdiff(colnames(as.data.frame(matrice2)),rownames(sansNA))
    q=grep(t,levels(Data_Base$PARAMETER))
     
    for(i in 1:nlevels(Data_Base$PARAMETER)[-q]){
    .........
    }
    Lorsqu'il y a des colonnes supprimées ça fonctionne mais quand il n'y en a pas ça ne marche plus; t renvoie character(0) et q ne marche pas

    ??

    Merci

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    Re,

    d'après tes commentaires dans la dernière ligne du code, tu fais une boucle for sur les colonnes enlevées ! [-q]: t'enlèves les colonnes qui ne sont pas manquantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t=setdiff(colnames(as.data.frame(matrice2)),rownames(sansNA)) ## récupere le nom des colonnes sans celle que l'on a supprimé
    
    q=grep(t,levels(Data_Base$PARAMETER))
    for(i in 1:length(levels(Data_Base$PARAMETER)[-q]))] ## effectue une boucle sur tous les paramètres sauf celui ou la colonne a été supprimé
    La sortie de ce code ci dessous te permet de récupérer les noms de colonnes, si elles sont manquantes et la matrice sous forme d'une liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fun=function(Toto){
    w=which(apply(Toto,2,function(w){k=sum(is.na(w))==length(w)})==TRUE)
        if(length(w) !=0){
        MatriceFinale2=Toto[,-w]
        Nom<-colnames(MatriceFinale2)
        }
        else{
        MatriceFinale2=Toto
      Nom<-colnames(MatriceFinale2)
        }
    list(MatriceFinale2,Nom)
    }
     
    Résultat<-fun(matrice2)
    pour récupérer le nom de tes colonnes:pour récupérer La matrice:
    après tu fais la suite de ton programme

    voila
    Manoir

  18. #18
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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