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 :

Traitements selon le nom des colonnes


Sujet :

R

  1. #1
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 549
    Points : 243
    Points
    243
    Par défaut Traitements selon le nom des colonnes
    Bonjour,

    J'ai un data.frame d'une centaine de colonnes, que je voudrais transformer selon le nom des colonnes.

    Comme c'est un peu compliqué à expliquer, voici un exemple :
    J'ai le data.frame suivant (appelons le T1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Num A01  A02  B01  B02   CC
     1   0    0    0    2   001
     2   2    0    1    0   002
    Il est produit avec le programme T1 <- data.frame(Num=c('1','2'),A01=c(0,2),A02=c(0,0),A03=c(0,1),A04=c(2,0),BB=c('001','002'))Remarque : La variable Num est le numéro des observations.

    Je voudrais créer un data.frame T2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Num  CC  DD  NB
      1 001 B02   2
      2 002 A01   4
      2 002 B01   1
    Lorsque le nom d'une variable commence par la lettre A, sortir la valeur si elle est non nulle.
    Lorsque le nom d'une variable commence par la lettre B, sortir le double de la valeur si elle est non nulle.

    Cela revient à créer un programme qui ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Initialisation : 
    	Créer un data.frame vide, avec les variables Num, CC, DD, NB
    Pour chaque observation :
    	Pour chaque variable dont le nom commence par la lettre A :
    		Si la valeur de la variable est non nulle alors 
    			DD=nom de la variable 
    			NB=valeur de la variable 
    			Sortir le résultat dans le nouveau data.frame
    	Pour chaque variable dont le nom commence par la lettre B :
    		Si la valeur de la variable est non nulle alors 
    			DD=nom de la variable 
    			NB=2 * valeur de la variable
    			Sortir le résultat dans le nouveau data.frame
    Mon problème est de créer un data.frame vide que je remplie peu à peu, en faisant un traitement différencié selon le nom des variables.

    Est-ce que quelqu'un saurait réaliser un tel programme avec R ?

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Points : 1 320
    Points
    1 320
    Par défaut Traitements selon le nom des colonnes
    Bonjour,

    Une proposition de code avec la fonction melt() du package reshape2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > T1 <- data.frame(Num=c('1','2'),
    +                  A01=c(0,2),A02=c(0,0),
    +                  B01=c(0,1),B02=c(2,0),
    +                  CC=c('001','002'))
    > T1
      Num A01 A02 B01 B02  CC
    1   1   0   0   0   2 001
    2   2   2   0   1   0 002
    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
    > library(reshape2)
    > T2 <- melt(T1,
    +            id.vars=c('Num','CC'),
    +            mesure.vars=c('A01':'B02'),
    +            value.name="NB")
    > T2
      Num  CC variable NB
    1   1 001      A01  0
    2   2 002      A01  2
    3   1 001      A02  0
    4   2 002      A02  0
    5   1 001      B01  0
    6   2 002      B01  1
    7   1 001      B02  2
    8   2 002      B02  0
    Vous devriez aboutir à vos fins à partir du dataframe T2.

    Cordialement,

  3. #3
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 549
    Points : 243
    Points
    243
    Par défaut
    Bonjour,

    Merci pour cette info.

    Pourriez-vous m'expliquer ce que fait précisément cette fonction.
    Dans votre exemple, la fonction Melt effectue le même traitement sur toutes les variables, alors que je souhaiterais faire un traitement différencié selon le nom des colonnes.
    Dans mon exemple, il s'agissait de multiplier par 2 le nombre final, lorsque le nom de la variable commençais par la lettre B.

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Points : 1 320
    Points
    1 320
    Par défaut Traitements selon le nom des colonnes
    Bonjour,

    La fonction melt() transpose les données. Maintenant il vous suffit de tester la valeur de variable pour multiplier NB par 2 si besoin et supprimer les lignes où NB=0.

    Cordialement,

  5. #5
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 549
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par mgdondon Voir le message
    La fonction melt() transpose les données. Maintenant il vous suffit de tester la valeur de variable pour multiplier NB par 2 si besoin et supprimer les lignes où NB=0
    Effectivement.

    Je vais indiquer ce post comme résolu.
    Je vous remercie.

  6. #6
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Points : 1 320
    Points
    1 320
    Par défaut R for SAS and SPSS Users
    J'ai cru comprendre dans un autre message que vous êtes un utilisateur SAS.

    Je vous conseille le livre R for SAS and SPSS Users, Second Edition, Robert A. Muenschen, Springer, 2011.

    Cordialement,

  7. #7
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 549
    Points : 243
    Points
    243
    Par défaut
    Oui en effet, je suis en train de doucement migrer vers R.
    Une des raisons est aussi la défaillance de mon anglais.
    C'est pourquoi, avant d'utiliser la référence que vous donnez, je vais essayer de me satisfaire avec les forums (dont celui-ci).

    En tout cas je vous remercie.

  8. #8
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Points : 1 320
    Points
    1 320
    Par défaut Traitements selon le nom des colonnes
    Ce livre est vraiment très bien fait avec le code SAS, son équivalent en R et souvent le résultat des fonctions R. Il n'est pas vraiment nécessaire de parler anglais. Un index reprend le nom des fonctions SAS et R.

    Cordialement,

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

Discussions similaires

  1. [JTable] les noms des colonnes de s'affichent pas
    Par macben dans le forum Composants
    Réponses: 6
    Dernier message: 25/04/2008, 11h03
  2. Noms des colonnes ne s'affichent pas dans un JTable
    Par Bourdet dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 07/07/2005, 15h26
  3. [JDBC]Nom des colonnes d'une table
    Par Guybrush dans le forum JDBC
    Réponses: 6
    Dernier message: 08/09/2004, 18h28
  4. [Firebird 1.5] nom des colonnes d'une table
    Par c0rwyn dans le forum SQL
    Réponses: 4
    Dernier message: 03/09/2004, 14h44
  5. [SWING][JTable]Cacher noms des colonnes
    Par Antunes dans le forum Composants
    Réponses: 2
    Dernier message: 28/06/2004, 11h48

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