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 :

Créer une colonne 'groupe en fonction d'une autre colonne


Sujet :

R

  1. #1
    Membre du Club
    Homme Profil pro
    technicien
    Inscrit en
    Mars 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 24
    Points : 43
    Points
    43
    Par défaut Créer une colonne 'groupe en fonction d'une autre colonne
    Bonjour,

    je ne saurais même pas donner un nom approprié à ma manipulation donc dsl si il y a un doublon...

    j'ai une colonne 'booléen' et j'aimerai créer une 2e colonne qui identifie un groupe jusqu'au changement d'état:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    c1     c2
    0     1
    0     1
    0     1
    1     2
    1     2
    0     3
    0     3
    0     3
    0     3
    1     4
    1     4
    1     4
    Avec mon reflexe de codeur de type 'vba' je vais tourner en boucle sur la colonne et i=1 'while' c1 == 0 puis i=i+1 puis c2=i 'while' c1=1 etc...

    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
     
    i <- 0
    l <- 1
    while (l<nrow(gpe_data)) {
     
      i <- i+1
     
      while (gpe_data[l,1] == 0) {
        gpe_data[l,2] <- i
        l <- l+1
      }
     
      i <- i+1
     
      while (gpe_data[l,1] == 1) {
        gpe_data[l,2] <- i
        l <- l+1
      }
     
     
    }
    bon ben c'est bien ça marche mais j'ai a peu près 1 500 000 lignes, c'est donc très long a exécuter et surtout pas la meilleure approche en R. Auriez-vous une idée plus approprié?


    Merci pour votre aide. (j’espère que c'est clair et lisible...)

  2. #2
    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,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c2<-cumsum(c(1,abs(diff(c1))))

  3. #3
    Membre du Club
    Homme Profil pro
    technicien
    Inscrit en
    Mars 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 24
    Points : 43
    Points
    43
    Par défaut
    Bonjour Sengar,

    merci pour ta réponse (brève mais efficace). Peux-tu expliquer en détail ce que fait cette fonction stp? ça fonctionne mais je ne sais pas comment...


    Allé, encore merci, j'ai ce qu'il faut en tout cas.

  4. #4
    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
    diff() permet de faire le differentiel d'un vecteur.

    En clair : 1 1 0 1 0 0 devient 0 -1 1 -1 0

    abs() prend la valeur absolue : du coup, abs(diff()) sur ton vecteur prend forcément ou la valeur 0 (si il n'y a pas eu de changement d'état) ou 1 (s'il vient d'y a avoir un changement d'état).
    0 -1 1 -1 0 devient 0 1 1 1 0


    Je rajoute un élement 1 grâce à c(1,) en première position de ce vecteur pour dire qu'on partira de l'état numérotté 1.
    0 1 1 1 0 devient 1 0 1 1 1 0


    Une fois que tu as repéré les instants de changements d'état, tu peux utiliser cumsum() qui fait la somme cumulée d'un vecteur :
    1 0 1 1 1 0 devient 1 1 2 3 4 4, ce qui est le résultat attendu.

  5. #5
    Membre du Club
    Homme Profil pro
    technicien
    Inscrit en
    Mars 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 24
    Points : 43
    Points
    43
    Par défaut
    génial, je vais méditer la dessus... MERCI!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/02/2014, 10h01
  2. Réponses: 8
    Dernier message: 31/10/2012, 17h20
  3. Créer un graphique Excel en fonction d'une colonne
    Par djerbafr dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/06/2010, 14h33
  4. Réponses: 4
    Dernier message: 31/10/2006, 19h03

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