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 :

Transposition ou boucle


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut Transposition ou boucle
    Bonjour,

    Voici un jeu de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    df <- read.table(text = "ID        SEAU         PELLE RATEAU
                     PERSONNE1     1 0   0  
                     PERSONNE2     1  1 1     
                     PERSONNE3    0  1 1 
                       ", header = TRUE)

    Je cherche le code qui permet de créer la table comme suit :


    ID TYPE
    PERSONNE1 SEAU
    PERSONNE2 SEAU
    PERSONNE2 PELLE
    PERSONNE2 RATEAU
    PERSONNE3 PELLE
    PERSONNE3 RATEAU

    J'ai tenté une boucle mais ça ne fonctionne pas. ça semble être une transposition mais pas sûr...Quelqu'un aurait-il une idée?

    Merci pour votre aide

  2. #2
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Transposition
    Ça marche en effet bien par transposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df <- read.table(text = "ID SEAU PELLE RATEAU
    +                          PERSONNE1 1 0 0
    +                          PERSONNE2 1 1 1
    +                          PERSONNE3 0 1 1", 
    +                  header = TRUE)
    > df
             ID SEAU PELLE RATEAU
    1 PERSONNE1    1     0      0
    2 PERSONNE2    1     1      1
    3 PERSONNE3    0     1      1
    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
    > library(reshape2)
    > df <- melt(df,
    +            id.vars=c('ID'),
    +            mesure.vars=c('SEAU':'RATEAU'),
    +            variable.name="TYPE",
    +            value.name="NB")
    > df
             ID   TYPE NB
    1 PERSONNE1   SEAU  1
    2 PERSONNE2   SEAU  1
    3 PERSONNE3   SEAU  0
    4 PERSONNE1  PELLE  0
    5 PERSONNE2  PELLE  1
    6 PERSONNE3  PELLE  1
    7 PERSONNE1 RATEAU  0
    8 PERSONNE2 RATEAU  1
    9 PERSONNE3 RATEAU  1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > df <- df[df$NB==1,-3]
    > df
             ID   TYPE
    1 PERSONNE1   SEAU
    2 PERSONNE2   SEAU
    5 PERSONNE2  PELLE
    6 PERSONNE3  PELLE
    8 PERSONNE2 RATEAU
    9 PERSONNE3 RATEAU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > df <- df[order(df$ID),]
    > df
             ID   TYPE
    1 PERSONNE1   SEAU
    2 PERSONNE2   SEAU
    5 PERSONNE2  PELLE
    8 PERSONNE2 RATEAU
    6 PERSONNE3  PELLE
    9 PERSONNE3 RATEAU
    Cordialement,

  3. #3
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut
    Merci beaucoup, c'est parfait! C'est exactement ça!

    Etant débutante, j'ai beaucoup de mal à avoir la logique R. Je suis partie sur une boucle complexe! 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,

    la fonction gather de la librairie tidyr peut te simplifier la vie aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    library(tidyr)
    df[,-1][df[,-1]==0] <- NA
    gather(df, "Type", "valeur", -1, na.rm = T)[,-3]
             ID   Type
    1 PERSONNE1   SEAU
    2 PERSONNE2   SEAU
    5 PERSONNE2  PELLE
    6 PERSONNE3  PELLE
    8 PERSONNE2 RATEAU
    9 PERSONNE3 RATEAU
    On peut aussi faire ce genre de manipulation avec les fonctions de bases de R en se servant de la transformation d'une table en data.frame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    df <- read.table(text = "ID        SEAU         PELLE RATEAU
                     PERSONNE1     1 0   0  
                     PERSONNE2     1  1 1     
                     PERSONNE3    0  1 1 
                       ", header = TRUE)
    df2 <- as.matrix(df[,-1])
    rownames(df2) <- df[,1]
    class(df2) <- "table"
    df2 <- as.data.frame(df2)
    df2 <- df2[df2$Freq == 1, -3]
    cdlt

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

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. [langage] if et boucle { ..}
    Par kacedda dans le forum Langage
    Réponses: 15
    Dernier message: 28/04/2003, 17h25
  3. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 10h47
  4. Sortir d'un progamme qui boucle ou qui refresh
    Par mikevador02 dans le forum C
    Réponses: 12
    Dernier message: 14/12/2002, 09h38
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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