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 :

Transformation de data frame


Sujet :

R

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Points : 29
    Points
    29
    Par défaut Transformation de data frame
    Bonjour,

    J'ai un data frame qui a une certaine forme et j'aimerais remodeler la forme du data frame. J'ai par exemple utilisé la fonction cast() qui me donne déjà un bon résultat cependant ce n'est pas exactement ce que j'attends. Pour être plus clair je vais vous montrer un exemple de mon data frame :

    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
    28
    29
    30
    31
    32
     
    df <- data.frame("Periode"  = c("2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01",
                                    "2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01",
                                    "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01",
                                    "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01",
                                    "2019-01-01", "2019-01-01", "2019-01-01", "2019-01-01"),
                     "Action"   = c(1, 2, 3, 4,
                                    5, 6, 7, 8, 9, 10,
                                    1, 2, 3, 4,
                                    5, 6, 7, 8, 9, 10,
                                    1, 2, 3, 4),
                     "Nom"      = c("A", "A", "A", "A",
                                    "A", "A", "A", "A", "A", "A",
                                    "A", "A", "A", "A",
                                    "A", "A", "A", "A", "A", "A",
                                    "A", "A", "A", "A"),
                     "Sous_Nom" = c("a", "a", "a", "a",
                                    "a", "a", "a", "a", "a", "a",
                                    "a", "a", "a", "a",
                                    "a", "a", "a", "a", "a", "a",
                                    "b", "b", "b", "b"),
                     "Nombre"   = c(4637, 4637, 4637, 4637,
                                    500, 500, 500, 500, 500, 500,
                                    3000, 3000, 3000, 3000,
                                    30, 30, 30, 30, 30, 30,
                                    2000, 2000, 2000, 2000),
                     "Temps"    = c(5, 5, 120, 20,
                                    30, 0, 1, 0, 0, 1,
                                    2, 2, 120, 10,
                                    10, 0, 1, 0, 0, 1,
                                    5, 5, 10, 5),
                     stringsAsFactors = FALSE)
    Voici un exemple du résultat attendu :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    result <- data.frame("Nom"      = c("A", "A"),
                         "Sous_Nom" = c("a", "b"),
                         "Nb_1"     = c(NA, 2000),
                         "Nbr_1"    = c(NA, NA),
                         "Temps_1"  = c(NA, 25),
                         "Nb_2"     = c(NA, NA),
                         "Nbr_2"    = c(NA, NA),
                         "Temps_2"  = c(NA, NA),
                         "Nb_3"     = c(NA, NA),
                         "Nbr_3"    = c(NA, NA),
                         "Temps_3"  = c(NA, NA),
                         "Nb_4"     = c(NA, NA),
                         "Nbr_4"    = c(NA, NA),
                         "Temps_4"  = c(NA, NA),
                         "Nb_5"     = c(4637, NA),
                         "Nbr_5"    = c(500, NA),
                         "Temps_5"  = c(182, NA),
                         "Nb_6"     = c(3000, NA),
                         "Nbr_6"    = c(30, NA),
                         "Temps_6"  = c(146, NA),
                         "Nb_7"     = c(NA, NA),
                         "Nbr_7"    = c(NA, NA),
                         "Temps_7"  = c(NA, NA),
                         "Nb_8"     = c(NA, NA),
                         "Nbr_8"    = c(NA, NA),
                         "Temps_8"  = c(NA, NA),
                         "Nb_9"     = c(NA, NA),
                         "Nbr_9"    = c(NA, NA),
                         "Temps_9"  = c(NA, NA),
                         "Nb_10"    = c(NA, NA),
                         "Nbr_10"   = c(NA, NA),
                         "Temps_10" = c(NA, NA),
                         "Nb_11"    = c(NA, NA),
                         "Nbr_11"   = c(NA, NA),
                         "Temps_11" = c(NA, NA),
                         "Nb_12"    = c(NA, NA),
                         "Nbr_12"   = c(NA, NA),
                         "Temps_12" = c(NA, NA),
                         stringsAsFactors = FALSE)
    La colonne "Nb_X" (le X correspond au mois) correspond à la colonne "Nombre" du data frame "df" cependant il faut récupérer la valeur d'une ligne dont la colonne "Action" est comprise entre 1 et 4.

    La colonne "Nbr_X" (le X correspond au mois) correspond à la colonne "Nombre" du data frame "df" cependant il faut récupérer la valeur d'une ligne dont la colonne "Action" est comprise entre 5 et 10.

    La colonne "Temps_X" (le X correspond au mois) correspond au total de la colonne "Temps" du data frame "df" est ceci quelque soit la valeur de "Action" il faut seulement cumuler la donnée qui fait partie du même mois.

    J'espère avoir exprimer mon problème/besoin assez clairement si quoi que se soit vous paraisses ambiguë n'hésitez pas à m'en informer j'essayerai de vous expliquer plus clairement si besoin.

    Cordialement,

    Arkning.

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Transformation de data frame
    Bonjour,

    Une proposition :

    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
    28
    29
    30
    31
    df <- data.frame("Periode"  = c("2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01",
                                    "2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01", "2019-05-01",
                                    "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01",
                                    "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01", "2019-06-01",
                                    "2019-01-01", "2019-01-01", "2019-01-01", "2019-01-01"),
                     "Action"   = c(1, 2, 3, 4,
                                    5, 6, 7, 8, 9, 10,
                                    1, 2, 3, 4,
                                    5, 6, 7, 8, 9, 10,
                                    1, 2, 3, 4),
                     "Nom"      = c("A", "A", "A", "A",
                                    "A", "A", "A", "A", "A", "A",
                                    "A", "A", "A", "A",
                                    "A", "A", "A", "A", "A", "A",
                                    "A", "A", "A", "A"),
                     "Sous_Nom" = c("a", "a", "a", "a",
                                    "a", "a", "a", "a", "a", "a",
                                    "a", "a", "a", "a",
                                    "a", "a", "a", "a", "a", "a",
                                    "b", "b", "b", "b"),
                     "Nombre"   = c(4637, 4637, 4637, 4637,
                                    500, 500, 500, 500, 500, 500,
                                    3000, 3000, 3000, 3000,
                                    30, 30, 30, 30, 30, 30,
                                    2000, 2000, 2000, 2000),
                     "Temps"    = c(5, 5, 120, 20,
                                    30, 0, 1, 0, 0, 1,
                                    2, 2, 120, 10,
                                    10, 0, 1, 0, 0, 1,
                                    5, 5, 10, 5),
                     stringsAsFactors = FALSE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    df$Mois <- as.numeric(substr(df$Periode,6,7))
    df$Action_cat <- ifelse(df$Action <= 4,1,2)
    df$Mois2 <- df$Mois + df$Action_cat/10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    df_temps <- aggregate(Temps ~ Nom+Sous_Nom+Mois, data = df, FUN = sum)
    df_temps <- reshape(data=df_temps[order(df_temps$Mois),],
                             idvar=c("Nom","Sous_Nom"),
                             v.names=c("Temps"),
                             timevar=c("Mois"),
                             direction="wide")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > df_temps
      Nom Sous_Nom Temps.1 Temps.5 Temps.6
    1   A        b      25      NA      NA
    2   A        a      NA     182     146
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    df_nombre <- df
    df_nombre$RepNo <- sequence(rle(as.vector(paste(df$Nom, df$Sous_Nom, df$Mois2)))$lengths)
    df_nombre <- df_nombre[which(df_nombre$RepNo == 1),c("Nom","Sous_Nom","Nombre","Mois2")]
    df_nombre <- reshape(data=df_nombre[order(df_nombre$Mois2),],
                              idvar=c("Nom","Sous_Nom"),
                              v.names=c("Nombre"),
                              timevar=c("Mois2"),
                              direction="wide")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > df_nombre
       Nom Sous_Nom Nombre.1.1 Nombre.5.1 Nombre.5.2 Nombre.6.1 Nombre.6.2
    21   A        b       2000         NA         NA         NA         NA
    1    A        a         NA       4637        500       3000         30
    Je vous laisse terminer.

    Cordialement,

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Merci beaucoup de votre solution qui marche à merveille, pour la suite j'ai mergé les data frames df_temps et df_nombre par "Nom" et "Sous_Nom". J'avais juste une dernière question à ce sujet comment puis-je mettre les colonnes dans l'ordre comme celui du data frame "result" ?

    Je sais qu'il est possible de changer l'ordre des colonnes de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    df <- df[, c(1, 3, 2, 4, 5)
    Mais j'aimerais savoir s'il était possible de lui passer un vecteur ou une autre manière pour organiser les colonnes dans l'ordre croissant des mois et par ordre "Nombre.X.1", "Nombre.X.2", "TempsX".

    Dois-je rajouter une colonne qui me permettrait d'effectuer ce tri ?

    Cordialement,

    Arkning

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Réordonner les variables
    Bonjour,

    Vous pouvez utiliser le nom des variables plutôt que leur numéro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    df_tot <- merge(df_nombre,df_temps,by=c("Nom","Sous_Nom"))
    listvar <- c("Nom","Sous_Nom","Nombre.1.1","Temps.1",
                                  "Nombre.5.1","Nombre.5.2","Temps.5",
                                  "Nombre.6.1","Nombre.6.2","Temps.6")
    df_tot <- df_tot[, listvar]
    Cordialement,

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

Discussions similaires

  1. Transformation matrice en data frame
    Par momo42 dans le forum R
    Réponses: 3
    Dernier message: 18/07/2017, 11h35
  2. Mean par colonne dans une data frame
    Par manoir dans le forum R
    Réponses: 3
    Dernier message: 19/06/2009, 11h06
  3. Trier une data frame
    Par manoir dans le forum R
    Réponses: 4
    Dernier message: 28/04/2009, 16h29
  4. Réponses: 2
    Dernier message: 14/11/2008, 14h53
  5. Transformer String data dans sous-etat en date
    Par raha_mtl dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 05/11/2007, 11h26

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