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 sur des noms de colonnes d'un dataframe


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 156
    Par défaut Boucle sur des noms de colonnes d'un dataframe
    Bonjour le forum,

    Après des années loin de R, voilà que je me remets à travailler dessus, et j'ai certainement perdu beaucoup de réflexes et oublié de nombreuses méthodes.

    Quoi qu'il en soit, j'arrive pour le moment à bidouiller certaines choses comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dta$a2[dta$NOMENCLA==1] <- 1
    dta$a3[dta$NOMENCLA==2] <- 1
    dta$a4[dta$NOMENCLA==3] <- 1
    dta$a5[dta$NOMENCLA==4] <- 1
    Et vous l'aurez compris, je peux avoir x colonne "a". Je souhaites donc mettre tout cela dans une boucle, mais impossible d'y parvenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i in 2:(nb+1)) {
      dta$a???[dta$NOMENCLA==(i-1)] <- 1
    }
    J'ai cherché et encore cherché, mais impossible de faire fonctionner cette boucle. Comment y parvenir ?

    Bien sûr, s'il y a moyen de s'en sortir sans boucle, et donc d'optimiser ce code, je suis preneur !

    Merci à vous.

  2. #2
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    tu peux faire ce genre de choses avec les commandes parse et eval :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i in 2:(nb+1))
      eval(parse(text = sprintf("dta$a%d[dta$NOMENCLA== %d] <- 1", i, i-1)))
    cdlt

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 156
    Par défaut
    Merci beaucoup, ça marche en l'état, nickel.

    Par contre, j'essaie de comprendre exactement ce qu'il se passe dans ce code pour pouvoir m'en resservir sans l'appliquer bêtement, mais je coince un peu entre les différences exactes de eval, parse, et sprintf malgré mes recherches.
    Et je n'arrive pas à l'exécuter pas à pas pour comprendre ce qu'il s'y passe.
    Pourrais-tu m'en dire plus pour éclairer ma lanterne ?

    Encore merci.

  4. #4
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    Pour pouvoir tester manuellement les choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i <- 2
    sprintf("dta$a%d[dta$NOMENCLA== %d] <- 1", i, i-1)
    [1] "dta$a2[dta$NOMENCLA== 1] <- 1"
    sprintf permet de créer une chaine de caractère en remplaçant ce qu'il y a derrière le "%" par une classe particulière de chaine de caractère. %d va être remplacer par un entier, %f par un nombre décimal, etc. Donc ici le premier %d juste après le a va être remplacé par i, parce que c'est le premier élement après la chaîne de caractère, et le deuxième %d va être remplacé par i-1 parce que c'est le deuxième élément après la chaîne de caractère.
    Avec sprintf (tu aurais pu faire ça avec la commande paste aussi) on écrit la chaîne de caractère qui correspond à la commande R qu'on aurait voulu faire.
    parse permet de transformer la chîane de caracère en expression donc de transformer la chaîne de caractère en un objet qui va pouvoir être interpréter par le logiciel.
    eval permet d'evaluer l'expression et de réaliser la commande.

    Pour plus d'info essaie ?eval, ?parse, ?sprintf.

    cdlt

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 156
    Par défaut
    J'avais bien essayé ?eval etc... mais ce n'était pas très très clair pour moi.

    En tout cas, merci beaucoup pour toutes ces explications, c'est plus clair pour moi !

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

Discussions similaires

  1. Boucle sur des noms de variables
    Par Felfla dans le forum MATLAB
    Réponses: 4
    Dernier message: 23/07/2015, 10h09
  2. Réponses: 4
    Dernier message: 12/08/2013, 18h17
  3. [bash] Boucle sur des noms de fichiers à espaces
    Par Le Furet dans le forum Linux
    Réponses: 8
    Dernier message: 16/12/2009, 07h59
  4. boucle sur des noms de répertoires
    Par machmalabala dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 29/08/2007, 11h34
  5. Boucle sur des lignes et colonnes
    Par Livet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/08/2007, 19h45

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