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 :

Définir une nouvelle variable


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Définir une nouvelle variable
    Bonjour, j'ai le tableau suivant:

    ID        SEXE        AGE
    Luc       M             18
    Luc       M             18  
    Luc       M             18
    Carine   M             23
    Carine   M             23
    Jean     F             32
    Jean     F             32 

    Je souhaiterais avoir le data suivant:
    NUMERO             SEXE           AGE
    
    1                      M                 18
    1                      M                 18
    1                      M                  18
    2                      F                   23
    2                      F                   23
    3                      M                   32
    3                      M                   32
    Merci à vous tous pour votre aide.

  2. #2
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut En associant boucle et condition on obtient ton tableau transforme
    Bonjour voilà un code qui fait ce que tu cherches:

    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
    donnees <- read.csv("C:/.../.../mes_donnees.csv")
    fix(donnees)
    #On crée une nouvelle colonne vide
    donnees$numero <- NA
    for (i in 1:length(donnees$numero)){
      if (donnees$id[i] == "Luc")
        donnees$numero[i] = 1
      if (donnees$id[i] == "Carine")
        donnees$numero[i] = 2
      if (donnees$id[i] == "Jean")
        donnees$numero[i] = 3
    }
    #On affiche de nouveau le tableau avec la nouvelle colonne
    donnees
    #On supprime la colonne id
    donnees <- subset( donnees, select = -id )
    #on affiche le resultat
    donnees
    Voilà le résultat:


    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
    > donnees
          id sex age numero
    1    Luc   M  18      1
    2    Luc   M  18      1
    3    Luc   M  18      1
    4 Carine   F  23      2
    5 Carine   F  23      2
    6   Jean   M  32      3
    7   Jean   M  32      3
    > donnees <- subset( donnees, select = -id )
    > donnees
      sex age numero
    1   M  18      1
    2   M  18      1
    3   M  18      1
    4   F  23      2
    5   F  23      2
    6   M  32      3
    7   M  32      3
    >
    Voilà tu peux tester le code.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Le code marche mais si j'ai une centaine de prénoms, ça devient ardu mais merci quand même.

  4. #4
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut Il faut coder tes donnees
    Bonjour,
    Même si tu as une longue liste de noms, il faudrait d'abord coder, comme dans mon exemple, tu peux adapter le code en augmentant les conditions, le tout mis dans une boucle. Donc à partir de mon code en haut, tu mets d'autres conditions ...if...
    Voilà

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    En passant par le package data.table, ça fonctionne sans la moindre boucle, quel que soit le nombre de personnes et quel que soit l'ordre de leur nom (et ça respecte leur ordre d'apparition dans le tableau, même si les lignes d'un même nom ne sont pas accolées) :
    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
    > dt <- data.table(ID = c("Luc", "Luc", "Luc", "Carine", "Carine", "Jean", "Jean"), SEXE = c("M", "M", "M", "M", "M", "F", "F"), AGE = c(18, 18, 18, 23, 23, 32, 32))
     
    > dt
     
           ID SEXE AGE
    1:    Luc    M  18
    2:    Luc    M  18
    3:    Luc    M  18
    4: Carine    M  23
    5: Carine    M  23
    6:   Jean    F  32
    7:   Jean    F  32
     
    > dt[, NUMERO := seq_len(nrow(dt))]
    > dt[, NUMERO := min(NUMERO), by = ID]
    > dt[, NUMERO := rep(1:length(rle(dt$NUMERO)$lengths), rle(dt$NUMERO)$lengths)]
     
    > dt
     
           ID SEXE AGE NUMERO
    1:    Luc    M  18      1
    2:    Luc    M  18      1
    3:    Luc    M  18      1
    4: Carine    M  23      2
    5: Carine    M  23      2
    6:   Jean    F  32      3
    7:   Jean    F  32      3
    Ca utilise également la fonction rle qui est bien pour ce genre de choses...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Bonjour,

    Je me permet d'intervenir même si vos codes marchent car les solutions proposées passent à côté du fond du problème, qui est bien plus basique.

    Ce que MathR veut faire, c'est attribuer un identifiant numerique unique à chaque prénom.
    Ca tombe bien, il existe déjà une classe R basique qui correspond à ca et que tout le monde connait : un facteur! (?factor)
    Nul besoin de recoder factor, les developpeurs de R l'ont fait pour vous!

    En une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    donnees$numero<-as.numeric(as.factor(donnees$id))
    Si l'ordre des identifiants t'importe, tout est déjà paramétré pour que tu puisses faire exactement ce que tu veux.
    Pour avoir des identifiants dans l'ordre d'apparition des prénoms par exemple, si Luc est le premier à apparaitre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    donnees$numero<-as.numeric(relevel(factor(dt$ID),ref="Luc"))

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    merci meme si je reviens un peu tard

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 7
    Points
    7
    Par défaut remerciements
    Merci pour vos réponses qui m'ont été vraiment utiles .

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

Discussions similaires

  1. Créer une nouvelle variable
    Par bob747 dans le forum R
    Réponses: 2
    Dernier message: 09/05/2012, 10h49
  2. Réponses: 3
    Dernier message: 25/08/2011, 13h23
  3. Résultat d'un test dans une nouvelle variable
    Par vallery dans le forum SAS STAT
    Réponses: 1
    Dernier message: 22/06/2011, 13h01
  4. Réponses: 24
    Dernier message: 27/04/2011, 16h00
  5. [Batch] créer une nouvelle variable d'environnement utilisateur
    Par riadmar dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 07/04/2011, 15h58

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