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 :

Comment remplir un data frame de manière spécifique à partir de deux autres data frame?


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Par défaut Comment remplir un data frame de manière spécifique à partir de deux autres data frame?
    Bonjour,

    Je travail avec deux data frame qui ont la même architecture et j'aimerais synthétiser les données présentes sur ceux-ci sur un seul et unique data frame. Voici un exemple :

    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
     
    df2 <- data.frame("S" = c("M", "M", "SE", "SI", "V", "M"), "C" = c(300, 400, 400, 500, 600, 1000), "F" = c("F1", "F2", "F3", "F2", "F4", "F5"),
                      "M" = c("M1", "M2", "M1", "M2", "M3", "M1"), stringsAsFactors = FALSE)
     
    df3 <- data.frame("S" = c("M", "SE", "SI"), "C" = c(3000, 4000, 5000), "F" = c("F1", "F2", "F3"),
                      "M" = c("M1", "M2", "M3"), stringsAsFactors = FALSE)
     
    df <- data.frame(F = sort(unlist(unique(df2$M))))
    a <- df2 %>% group_by(M) %>% summarise(C = sum(C))
    a <- as.data.frame(a)
    a <- a[order(a$M),]
    b <- df3 %>% group_by(M) %>% summarise(C = sum(C))
    b <- as.data.frame(b)
    b <- b[order(b$M),]
    df$M <- NA
    df$SE <- NA
    df$SI <- NA
    df$V <- NA
    df$T <- a$C
    df$T2 <- b$C
    df$T3 <- df$T / 3 * 12
    df$T4 <- ((df$T3 / df$T2) - 1) * 100
    df <- df[order(df$T, decreasing = TRUE),]
     
    df4 <- data.frame("F" = c("M1", "F5", "F3", "F1", "M2", "F2", "M3", "F4"),
                     "M" = c(1300, 1000, 0, 300, 400, 400, 0, 0),
                     "SE" = c(400, 0, 400, 0, 0, 0, 0, 0),
                     "SI" = c(0, 0, 0, 0, 500, 500, 0, 0),
                     "V" = c(0, 0, 0, 0, 0, 0, 600, 600),
                     "T" = c(1700, 1000, 400, 300, 900, 900, 600, 600),
                     "T2" = c(3000, 0, 0, 3000, 4000, 4000, 5000, 5000),
                     "T3" = 0,
                     "T4" = 0,
                     "R" = NA, stringsAsFactors = FALSE)
     
    df4$T3 <- df4$T / 3 * 12
    df4$T4 <- ((df4$T3 / df4$T2) - 1) * 100
    df4[c(2, 3), "T4"] <- 100
    Avant j'utilisai une boucle pour créer mon data frame au fur et à mesure, cependant je travailel avec des data frame qui contiennent beaucoup de ligne donc j'aimerais éviter d'en utiliser. Maintenant j'arrive à remplir mon data frame de synthèse comme le data frame "df" dans l'exemple et j'aimerais maintenant savoir comment je peux remplir mon data frame "df" pour arriver au même résultat que le data frame "df4".
    Ou alors si je peux arriver au résultat "df4" sans passez par l'étape de "df", je suis ouvert à toutes propositions.

    Il y a aussi beaucoup de contraintes à respecter comme le fait que l'ordre de la colonne "M" dans le résultat n'est pas forcément M1, M2, M3... mais ils doivent être dans l'ordre décroissant par rapport à la colonne "T" donc si on M3 = 200, M2 = 50 et M1 = 100 on aura M3 puis M1 puis M2, on a aussi le fait que lorsqu'on insert les lignes avec "F" dans le résultat elles doivent être également classées dans l'ordre décroissant toujours par rapport à "T" mais chacune propre au "MX" qui leur correspondent.

    Je tiens à préciser qu'il ne faut pas traiter les données comme elles sont présentées, je ne peux pas dévoiler les données avec lesquelles je travaille donc j'ai du les modifier. Je veux dire par cela qu'il ne faut pas par exemple se baser sur le fait que la colonne M contient des données de type "M1", "M2", "M3", ... "MX"

    Cordialement,

    Arkning

  2. #2
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Comment remplir un dataframe de manière spécifique à partir de deux autres dataframes ?
    Bonjour,

    Une proposition en s'amusant avec les transpositions.

    • Vos dataframes

    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
    41
    42
    43
    44
    45
    46
    library(tidyverse)
     
    df2 <- data.frame("S" = c("M", "M", "SE", "SI", "V", "M"), 
                      "C" = c(300, 400, 400, 500, 600, 1000), 
                      "F" = c("F1", "F2", "F3", "F2", "F4", "F5"),
                      "M" = c("M1", "M2", "M1", "M2", "M3", "M1"), 
                      stringsAsFactors = FALSE)
     
    df3 <- data.frame("S" = c("M", "SE", "SI"), 
                      "C" = c(3000, 4000, 5000), 
                      "F" = c("F1", "F2", "F3"),
                      "M" = c("M1", "M2", "M3"), 
                      stringsAsFactors = FALSE)
     
    df <- data.frame(F = sort(unlist(unique(df2$M))))
    a <- df2 %>% group_by(M) %>% summarise(C = sum(C))
    a <- as.data.frame(a)
    a <- a[order(a$M),]
    b <- df3 %>% group_by(M) %>% summarise(C = sum(C))
    b <- as.data.frame(b)
    b <- b[order(b$M),]
    df$M <- NA
    df$SE <- NA
    df$SI <- NA
    df$V <- NA
    df$T <- a$C
    df$T2 <- b$C
    df$T3 <- df$T / 3 * 12
    df$T4 <- ((df$T3 / df$T2) - 1) * 100
    df <- df[order(df$T, decreasing = TRUE),]
     
    df4 <- data.frame("F"  = c("M1", "F5", "F3", "F1", "M2", "F2", "M3", "F4"),
                      "M"  = c(1300, 1000, 0, 300, 400, 400, 0, 0),
                      "SE" = c(400, 0, 400, 0, 0, 0, 0, 0),
                      "SI" = c(0, 0, 0, 0, 500, 500, 0, 0),
                      "V"  = c(0, 0, 0, 0, 0, 0, 600, 600),
                      "T"  = c(1700, 1000, 400, 300, 900, 900, 600, 600),
                      "T2" = c(3000, 0, 0, 3000, 4000, 4000, 5000, 5000),
                      "T3" = 0,
                      "T4" = 0,
                      "R"  = NA, 
                      stringsAsFactors = FALSE)
     
    df4$T3 <- df4$T / 3 * 12
    df4$T4 <- ((df4$T3 / df4$T2) - 1) * 100
    df4[c(2, 3), "T4"] <- 100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df2
       S    C  F  M
    1  M  300 F1 M1
    2  M  400 F2 M2
    3 SE  400 F3 M1
    4 SI  500 F2 M2
    5  V  600 F4 M3
    6  M 1000 F5 M1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > df3
       S    C  F  M
    1  M 3000 F1 M1
    2 SE 4000 F2 M2
    3 SI 5000 F3 M3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df4
       F    M  SE  SI   V    T   T2   T3       T4  R
    1 M1 1300 400   0   0 1700 3000 6800 126.6667 NA
    2 F5 1000   0   0   0 1000    0 4000 100.0000 NA
    3 F3    0 400   0   0  400    0 1600 100.0000 NA
    4 F1  300   0   0   0  300 3000 1200 -60.0000 NA
    5 M2  400   0 500   0  900 4000 3600 -10.0000 NA
    6 F2  400   0 500   0  900 4000 3600 -10.0000 NA
    7 M3    0   0   0 600  600 5000 2400 -52.0000 NA
    8 F4    0   0   0 600  600 5000 2400 -52.0000 NA
    • Transposition des dataframes df2 et df3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    library(reshape)
     
    df2m <- melt(df2,id.vars=c("S","C"))
    df2m <- df2m[,-3]
    names(df2m)[3]<-"F"
    df2m <- cbind(df2m[,c(1,3,2)])
     
    df3m <- melt(df3,id.vars=c("S","C"))
    df3m <- df3m[,-3]
    names(df3m)[3]<-"F"
    df3m <- cbind(df3m[,c(1,3,2)])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > df2m
        S  F    C
    1   M F1  300
    2   M F2  400
    3  SE F3  400
    4  SI F2  500
    5   V F4  600
    6   M F5 1000
    7   M M1  300
    8   M M2  400
    9  SE M1  400
    10 SI M2  500
    11  V M3  600
    12  M M1 1000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df3m
       S  F    C
    1  M F1 3000
    2 SE F2 4000
    3 SI F3 5000
    4  M M1 3000
    5 SE M2 4000
    6 SI M3 5000
    • Calcul des variables M, SE, SI, V

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > df_M_SE_SI_V <- cast(df2m,F~S,sum,value="C")
    >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_M_SE_SI_V
       F    M  SE  SI   V
    1 F1  300   0   0   0
    2 F2  400   0 500   0
    3 F3    0 400   0   0
    4 F4    0   0   0 600
    5 F5 1000   0   0   0
    6 M1 1300 400   0   0
    7 M2  400   0 500   0
    8 M3    0   0   0 600
    • Calcul de la variable T

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df_T <- aggregate(C~F,data=df2m,sum)
    names(df_T)[2]<-"T"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_T
       F    T
    1 F1  300
    2 F2  900
    3 F3  400
    4 F4  600
    5 F5 1000
    6 M1 1700
    7 M2  900
    8 M3  600
    • Calcul de la variable T2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df_T2 <- aggregate(C~F,data=df3m,sum)
    names(df_T2)[2]<-"T2"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df_T2
       F   T2
    1 F1 3000
    2 F2 4000
    3 F3 5000
    4 M1 3000
    5 M2 4000
    6 M3 5000
    • Merge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    df_tot <- merge(df_M_SE_SI_V,df_T,by="F",all=TRUE)
    df_tot <- merge(df_tot,df_T2,by="F",all=TRUE)
    df_tot$T2 <- ifelse(is.na(df_tot$T2),0,df_tot$T2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_tot
       F    M  SE  SI   V    T   T2
    1 F1  300   0   0   0  300 3000
    2 F2  400   0 500   0  900 4000
    3 F3    0 400   0   0  400 5000
    4 F4    0   0   0 600  600    0
    5 F5 1000   0   0   0 1000    0
    6 M1 1300 400   0   0 1700 3000
    7 M2  400   0 500   0  900 4000
    8 M3    0   0   0 600  600 5000
    • Calcul des variables T3, T4, R

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    df_tot$T3 <- df_tot$T / 3 * 12
    df_tot$T4 <- ((df_tot$T3 / df_tot$T2) - 1) * 100
    df_tot$T4 <- ifelse(df_tot$T4 == Inf,100,df_tot$T4)
    df_tot$R <- NA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_tot
       F    M  SE  SI   V    T   T2   T3       T4  R
    1 F1  300   0   0   0  300 3000 1200 -60.0000 NA
    2 F2  400   0 500   0  900 4000 3600 -10.0000 NA
    3 F3    0 400   0   0  400 5000 1600 -68.0000 NA
    4 F4    0   0   0 600  600    0 2400 100.0000 NA
    5 F5 1000   0   0   0 1000    0 4000 100.0000 NA
    6 M1 1300 400   0   0 1700 3000 6800 126.6667 NA
    7 M2  400   0 500   0  900 4000 3600 -10.0000 NA
    8 M3    0   0   0 600  600 5000 2400 -52.0000 NA
    • Tri des données pour pouvoir les comparer facilement avec le dataframe df4 (je n'ai pas compris vos contraintes de tri) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > df_tot <- df_tot[c(6,5,3,1,7,2,8,4),]
    >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_tot
       F    M  SE  SI   V    T   T2   T3       T4  R
    6 M1 1300 400   0   0 1700 3000 6800 126.6667 NA
    5 F5 1000   0   0   0 1000    0 4000 100.0000 NA
    3 F3    0 400   0   0  400 5000 1600 -68.0000 NA
    1 F1  300   0   0   0  300 3000 1200 -60.0000 NA
    7 M2  400   0 500   0  900 4000 3600 -10.0000 NA
    2 F2  400   0 500   0  900 4000 3600 -10.0000 NA
    8 M3    0   0   0 600  600 5000 2400 -52.0000 NA
    4 F4    0   0   0 600  600    0 2400 100.0000 NA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df4
       F    M  SE  SI   V    T   T2   T3       T4  R
    1 M1 1300 400   0   0 1700 3000 6800 126.6667 NA
    2 F5 1000   0   0   0 1000    0 4000 100.0000 NA
    3 F3    0 400   0   0  400    0 1600 100.0000 NA
    4 F1  300   0   0   0  300 3000 1200 -60.0000 NA
    5 M2  400   0 500   0  900 4000 3600 -10.0000 NA
    6 F2  400   0 500   0  900 4000 3600 -10.0000 NA
    7 M3    0   0   0 600  600 5000 2400 -52.0000 NA
    8 F4    0   0   0 600  600 5000 2400 -52.0000 NA
    • Comparaison des deux dataframes à l'aide du package compareDF (voir aussi cette discussion) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > library(compareDF)
    > comp <- compare_df(df_tot, df4, c("F"))
    Creating comparison table...
    Creating HTML table for first 100 rows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    > comp$comparison_df
       F chng_type M  SE SI   V   T   T2   T3  T4  R
    1 F3         + 0 400  0   0 400 5000 1600 -68 NA
    2 F3         - 0 400  0   0 400    0 1600 100 NA
    3 F4         + 0   0  0 600 600    0 2400 100 NA
    4 F4         - 0   0  0 600 600 5000 2400 -52 NA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > print(comp$html_output)
    >
    Nom : compareDF.PNG
Affichages : 1209
Taille : 6,5 Ko

    • Êtes-vous sûr de votre dataframe df4 ?

    Cordialement,

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

    Informations professionnelles :
    Activité : Epitech

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

    Merci de votre retour, oui en effet quand j'avais édité je me suis trompé c'est bien votre résultat df_tot qui est le résultat attendu, veuillez m'excuser pour cette erreur je vais la corriger cependant je ne peux que modifier le dernier message envoyé, comment puis-je modifier le premier ?

    Je vais essayer votre méthode avec les données avec lesquelles je travail et je vous fais un retour dès que possible.

    Alors pour vous expliquer mon tri, dans le résultat df_tot les variables "MX" doivent être classées dans l'ordre décroissant par rapport à "T" et chaque variables "FX" à un "MX" qui lui est assigné donc en dessous du "MX" les variables "FX" doivent également être classées dans l'ordre décroissant par rapport à "T". Dites-moi si cela vous parait plus clair.

    Bien à vous,

    Arkning

  4. #4
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Comment remplir un dataframe de manière spécifique à partir de deux autres dataframes ?
    Bonjour,

    Citation Envoyé par Arkning Voir le message
    Merci de votre retour, oui en effet quand j'avais édité je me suis trompé c'est bien votre résultat df_tot qui est le résultat attendu, veuillez m'excuser pour cette erreur je vais la corriger cependant je ne peux que modifier le dernier message envoyé, comment puis-je modifier le premier ?
    Les messages sont modifiables pendant 72 heures (voir le grand mode d'emploi du forum). Ensuite il faut demander à un administrateur mais ce n'est pas forcément nécessaire ici.

    Alors pour vous expliquer mon tri, dans le résultat df_tot les variables "MX" doivent être classées dans l'ordre décroissant par rapport à "T" et chaque variables "FX" à un "MX" qui lui est assigné donc en dessous du "MX" les variables "FX" doivent également être classées dans l'ordre décroissant par rapport à "T". Dites-moi si cela vous parait plus clair.
    OK, je n'avais pas vu comment étaient intercalées les variables "FX". Il faut donc conserver l'association FX-MX. J'ai modifié et complété mon programme.

    • On conserve l'association FX-MX lors de la première étape.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    df2m <- df2
    df2m$F <- df2m$M
    df2m <- rbind(df2m,df2)
    names(df2m)[4]<-"FM"
     
    df3m <- df3
    df3m$F <- df3m$M
    df3m <- rbind(df3m,df3)
    names(df3m)[4]<-"FM"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > df2m
        S    C  F FM
    1   M  300 M1 M1
    2   M  400 M2 M2
    3  SE  400 M1 M1
    4  SI  500 M2 M2
    5   V  600 M3 M3
    6   M 1000 M1 M1
    7   M  300 F1 M1
    8   M  400 F2 M2
    9  SE  400 F3 M1
    10 SI  500 F2 M2
    11  V  600 F4 M3
    12  M 1000 F5 M1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df3m
       S    C  F FM
    1  M 3000 M1 M1
    2 SE 4000 M2 M2
    3 SI 5000 M3 M3
    4  M 3000 F1 M1
    5 SE 4000 F2 M2
    6 SI 5000 F3 M3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > df_M_SE_SI_V <- cast(df2m,F+FM~S,sum,value="C")
    >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_M_SE_SI_V
       F FM    M  SE  SI   V
    1 F1 M1  300   0   0   0
    2 F2 M2  400   0 500   0
    3 F3 M1    0 400   0   0
    4 F4 M3    0   0   0 600
    5 F5 M1 1000   0   0   0
    6 M1 M1 1300 400   0   0
    7 M2 M2  400   0 500   0
    8 M3 M3    0   0   0 600
    • Les étapes suivantes ne changent pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    df_T <- aggregate(C~F,data=df2m,sum)
    names(df_T)[2]<-"T"
    df_T2 <- aggregate(C~F,data=df3m,sum)
    names(df_T2)[2]<-"T2"
    df_tot <- merge(df_M_SE_SI_V,df_T,by="F",all=TRUE)
    df_tot <- merge(df_tot,df_T2,by="F",all=TRUE)
    df_tot$T2 <- ifelse(is.na(df_tot$T2),0,df_tot$T2)
    df_tot$T3 <- df_tot$T / 3 * 12
    df_tot$T4 <- ((df_tot$T3 / df_tot$T2) - 1) * 100
    df_tot$T4 <- ifelse(df_tot$T4 == Inf,100,df_tot$T4)
    df_tot$R <- NA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_tot
       F FM    M  SE  SI   V    T   T2   T3       T4  R
    1 F1 M1  300   0   0   0  300 3000 1200 -60.0000 NA
    2 F2 M2  400   0 500   0  900 4000 3600 -10.0000 NA
    3 F3 M1    0 400   0   0  400 5000 1600 -68.0000 NA
    4 F4 M3    0   0   0 600  600    0 2400 100.0000 NA
    5 F5 M1 1000   0   0   0 1000    0 4000 100.0000 NA
    6 M1 M1 1300 400   0   0 1700 3000 6800 126.6667 NA
    7 M2 M2  400   0 500   0  900 4000 3600 -10.0000 NA
    8 M3 M3    0   0   0 600  600 5000 2400 -52.0000 NA
    • On trie les données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    df_M <- df_tot[which(df_tot$F==df_tot$FM),]
    df_M <- df_M[order(df_M$T),]
    df_M$tri1 <- c(1:nrow(df_M))
    df_tot <- merge(df_tot,df_M[,c("FM","tri1")],by="FM",all=TRUE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_tot
      FM  F    M  SE  SI   V    T   T2   T3       T4  R tri1
    1 M1 F1  300   0   0   0  300 3000 1200 -60.0000 NA    3
    2 M1 F3    0 400   0   0  400 5000 1600 -68.0000 NA    3
    3 M1 F5 1000   0   0   0 1000    0 4000 100.0000 NA    3
    4 M1 M1 1300 400   0   0 1700 3000 6800 126.6667 NA    3
    5 M2 F2  400   0 500   0  900 4000 3600 -10.0000 NA    2
    6 M2 M2  400   0 500   0  900 4000 3600 -10.0000 NA    2
    7 M3 F4    0   0   0 600  600    0 2400 100.0000 NA    1
    8 M3 M3    0   0   0 600  600 5000 2400 -52.0000 NA    1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df_tot$tri2 <- ifelse(df_tot$F==df_tot$FM,Inf,df_tot$T)
    df_tot <- df_tot[order(-df_tot$tri1,-df_tot$tri2),]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_tot
      FM  F    M  SE  SI   V    T   T2   T3       T4  R tri1 tri2
    4 M1 M1 1300 400   0   0 1700 3000 6800 126.6667 NA    3  Inf
    3 M1 F5 1000   0   0   0 1000    0 4000 100.0000 NA    3 1000
    2 M1 F3    0 400   0   0  400 5000 1600 -68.0000 NA    3  400
    1 M1 F1  300   0   0   0  300 3000 1200 -60.0000 NA    3  300
    6 M2 M2  400   0 500   0  900 4000 3600 -10.0000 NA    2  Inf
    5 M2 F2  400   0 500   0  900 4000 3600 -10.0000 NA    2  900
    8 M3 M3    0   0   0 600  600 5000 2400 -52.0000 NA    1  Inf
    7 M3 F4    0   0   0 600  600    0 2400 100.0000 NA    1  600
    • On supprime les variables de travail.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > df_tot <- subset(df_tot,select=-c(FM,tri1,tri2))
    >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > df_tot
       F    M  SE  SI   V    T   T2   T3       T4  R
    4 M1 1300 400   0   0 1700 3000 6800 126.6667 NA
    3 F5 1000   0   0   0 1000    0 4000 100.0000 NA
    2 F3    0 400   0   0  400 5000 1600 -68.0000 NA
    1 F1  300   0   0   0  300 3000 1200 -60.0000 NA
    6 M2  400   0 500   0  900 4000 3600 -10.0000 NA
    5 F2  400   0 500   0  900 4000 3600 -10.0000 NA
    8 M3    0   0   0 600  600 5000 2400 -52.0000 NA
    7 F4    0   0   0 600  600    0 2400 100.0000 NA
    Cordialement,

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

    Informations professionnelles :
    Activité : Epitech

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

    Encore un grand merci à vous, j'ai du juste supprimer les lignes avec NA parce que j'avais omis de préciser que les "FX" et "MX" présents dans df3 mais qui ne le sont pas dans df2 ne doivent pas être mis dans le tableau final.
    Le résultat est bien celui qui était attendu.

    En vous souhaitant une bonne fin de semaine,

    Cordialement,

    Arkning

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/03/2018, 00h05
  2. Comment remplir un Data Grid View?
    Par jmud127 dans le forum VB.NET
    Réponses: 5
    Dernier message: 17/12/2017, 23h43
  3. Réponses: 2
    Dernier message: 15/06/2009, 08h59
  4. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  5. Réponses: 2
    Dernier message: 30/01/2007, 09h02

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