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 :

Faire une boucle pour supprimer des colonnes dans une liste de fichiers et écrire les fichiers


Sujet :

R

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 80
    Points : 34
    Points
    34
    Par défaut Faire une boucle pour supprimer des colonnes dans une liste de fichiers et écrire les fichiers
    Bonjour,

    j'aimerais supprimer des colonnes qui apparaissent en trop dans certains de mes fichiers dans un dossier "TESTin" et ensuite écrire les fichiers propres dans un fichier "TESTout". J'ai beaucoup de fichiers et il y a des erreurs dans certains mais pas dans d'autres, donc le but est de faire cela automatiquement. Ensuite je bind ces fichiers par noms de colonnes.

    Je m'explique:

    dans mon exemple, j'ai 2 fichiers que je veux réunir nommés "ww97_test_40_z1.xlsx" et ""ww97_test2_40_z1.xlsx".
    Pour réunir ces 2 fichiers par noms de colonnes identiques, j'ai un code qui fonctionne mais seulement si les colonnes ont des noms identiques donc ici j'ai un souci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    df_base <- read_excel(listZ1Y97[1])
    df_base <- mutate_all(df_base, as.character)
    for (i in c(2:length(listZ1Y97))) {
       df_join <- read_excel(listZ1Y97[i])
       df_join <- mutate_all(df_join, as.character)
       df_base <- rbind(df_base,df_join)
    }
    df_base
    View(df_base)
    write.csv2(df_base, "D:\\FinalDataModel20210820\\TESTout.csv")
    Avant de faire tourner ce code, j'aimerais donc supprimer automatiquement pour tous les fichiers de la liste dessous les colonnes "colToDelete1" et "colToDelete2" lorsqu'elles sont présentes (par exemple ici dans ww97_test_40_z1.xlsx).
    Ensuite j'ai un autre problème, dans certains fichiers j'ai des colonnes avec les noms correctes: "HauteurPLante", "HauteurPLanteDroite", et "HauteurPLanteGauche" comme dans "ww97_test2_40_z1.xlsx" dans cet exemple, mais dans d'autres fichiers il y a un problème, les noms des colonnes "HauteurPLanteDroite", et "HauteurPLanteGauche" ont été écrit "HauteurPlante" donc j'ai 3 fois des colonnes qui s'appellent "HauteurPlante" et j'aimerais pour tous les fichiers supprimer les colonnes qui portent les noms "HauteurPLante" ou"HauteurPLanteDroite" ou "HauteurPLanteGauche" pour solutionner ce problème (ou alors une deuxième option serait de dire à R que si il voit une colonne nommée "HauteurPlante" une fois il ne fait rien mais si il voit une deuxième fois il remplace par "HauteurPLanteDroite" et une troisième fois par "HauteurPlanteGauche" afin que je garde ces colonnes mais je crois que ça serait un peu trop compliqué).

    Ensuite j'aimerais écrire les fichiers propres dans "TESTout", pour pouvoir réunir les fichier avec "bind" avec mon code présenté dessus.
    Pouvez-vous m'aider à faire ça automatiquement svp?
    Merci par avance.

    voici les 2 fichiers Excel en pièce-jointe et voici mon code pour le moment:

    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
    #Import libraries
    library(stringr)
    library(readxl)
    library(WriteXLS)
    library(dataframes2xls)
    library(dplyr)
    library(varhandle)
    library(prettyR) #describe
     
    options(scipen = 999)  
     
     
    setwd ("D:\\FinalDataModel20210820\\in")
     
    ####year 97 - list files
    listZ1Y97 <- list.files("D:\\FinalDataModel20210820\\TESTin",
                            pattern = glob2rx("ww97*_z1.xlsx"))
    print(listZ1Y97)
     
     
     
    #bind the files by col names and write it in TESTOUT:
    df_base <- read_excel(listZ1Y97[1])
    df_base <- mutate_all(df_base, as.character)
    for (i in c(2:length(listZ1Y97))) {
       df_join <- read_excel(listZ1Y97[i])
       df_join <- mutate_all(df_join, as.character)
       df_base <- rbind(df_base,df_join)
    }
    df_base
    View(df_base)
    write.csv2(df_base, "D:\\FinalDataModel20210820\\TESTout.csv"
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour, teste ce code si ça répond à ton problème


    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
    ## à changer 
    liste_fichiers=list.files("TESTin/",pattern = ".xlsx",full.names = TRUE)
     
    lire_fichier <- function(fichier){
      df <- read_excel(fichier)
      ## on renomme les colonnes HauteurPlante
      names(df) <- names(df) %>% str_c(collapse = ",") %>% 
       str_replace("HauteurPLante...\\d","HauteurPLante") %>% 
       str_replace("HauteurPLante...\\d","HauteurPLanteDroite") %>% 
       str_replace("HauteurPLante...\\d","HauteurPLanteGauche") %>% 
       str_split(",",simplify = F) %>% flatten_chr()
      ## suppression des colonnes
      df <- df %>% select(-starts_with("colToDelete"))
    }
    ## creation tableau final
    resultat <- reduce(map(liste_fichiers,lire_fichier),bind_rows)
    cordialement

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 80
    Points : 34
    Points
    34
    Par défaut
    Bonjour,
    merci beaucoup, cela fonctionne très bien. Si je veux supprimer une colonne avec un nom spécifique et pas "commençant par" je fais comment?
    J'ai essayé par exemple pour supprimer uniquement la colonne "colToDelete1" mais ça ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      df <- df %>% select(-"colToDelete1")
    Merci par avance,
    meilleures salutations,
    Margot.

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    il faut enlever les quotes (les guillemets)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df <- df %>% select(-colToDelete1)

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 80
    Points : 34
    Points
    34
    Par défaut
    Bonjour,
    merci pour le retour. Même en enlevant les guillemets ça ne fonctionne pas, j'ai le message d'erreur:
    Error: Can't subset columns that don't exist.
    x The column `colToDelete1` doesn't exist.
    Run `rlang::last_error()` to see where the error occurred.
    mais en tapant le nom entier dans la formule initial cela fonctionne alors je vais faire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df <- df %>% select(-starts_with("colToDelete1"))
    df <- df %>% select(-starts_with("colToDelete2"))
    Dans mes fichiers j'ai des colonnes qui contiennent soit du numérique soit des NA selon les fichiers et ça me met un message d'erreur comme ceci:

    Error: Column `plotIdForSowing` can't be converted from character to numeric
    par exempe j'ai mis des NA dans la colonne "plotIdForSowing" dans un des 2 fichiers en PJ. Comment faire pour que ce code prenne en compte les NA s'il vous plait?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ATTACH]606056[/ATTACH][ATTACH]606057[/ATTACH]

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour ,
    tout d'abord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df <- df %>% select(-colToDelete1)
    supprime la colonne si elle existe mais renvoie une erreur si elle n'existe pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df <- df %>% select(-starts_with("colToDelete1"))
    supprime la colonne si elle existe ,ne renvoie pas d'erreur dans le cas contraire et le traitement continu

    pour le problème des "NA", juste une question , à priori les fichiers xlsx proviennent d'un traitement R ultérieur, il serait plus logique de traiter ce problème au moment de leur création et de l'enregistrement sous excel

    autrement j'ai modifié la fonction lire_fichier , mais cela ressemble plus à de la "bidouille"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    lire_fichier <- function(fichier){
      df <- read_excel(fichier)
      ## on renomme les colonnes HauteurPlante
      names(df) <- names(df) %>% str_c(collapse = ",") %>% 
        str_replace("HauteurPLante...\\d","HauteurPLante") %>% 
        str_replace("HauteurPLante...\\d","HauteurPLanteDroite") %>% 
        str_replace("HauteurPLante...\\d","HauteurPLanteGauche") %>% 
        str_split(",",simplify = F) %>% flatten_chr()
      ## suppression des colonnes
      df <- df %>% select(-starts_with("colToDelete")) %>% 
        mutate(across(is.character,~ifelse(str_detect(.x,"^(NA|[0-9]+)"),
                                           str_replace(.x,"NA","") %>% as.numeric(),.x)))
     
    }
    à vérifier si ça fonctionne dans tous les cas

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 80
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    merci beaucoup pour les explications et le nouveau code. Je travail sur des fichiers que l'on m'a transmis et qui ont été créé/transformé en partie par une macros et en partie par R c'est pour ça que je dois "nettoyer" ces fichiers avant de les joindre ici.

    Sur mes fichiers exemples ça fonctionne bien pour les NA par contre sur mes "vrais" fichiers plus gros ça fonctionne aussi mais j'ai un warning comme ceci:

    Warning messages:
    1: Problem with `mutate()` input `..1`.
    i `..1 = across(...)`.
    i NAs introduced by coercion
    2: Problem with `mutate()` input `..1`.

    que veut dire le "0-9" dans la partie du code suivante svp?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          mutate(across(is.character,~ifelse(str_detect(.x,"^(NA|[0-9]+)"),
                                             str_replace(.x,"NA","") %>% as.numeric(),.x)))
    Ensuite j'ai une autre question, le code fonctionne bien pour renommer les 2 colonnes fausses sur les 3 en "Hauteur..droite" et "hauteur..gauche" mais si je veux les renommer avec un autre nom par exemple "HauteurPLante" "DroiteHauteurPLante" et "GaucheHauteurPLante" comme dans le code ci-dessous, R conserve les 3 colonnes initiales et me créé des colonnes supplémentaires et les données sont splittées entre les 6 colonnes, comment puis-je solutionner ça svp?



    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
    lire_fichier <- function(fichier){
       df <- read_excel(fichier)
       ## on renomme les colonnes HauteurPlante
       names(df) <- names(df) %>% str_c(collapse = ",") %>% 
          str_replace("HauteurPLante...\\d","HauteurPLante") %>% 
          str_replace("HauteurPLante...\\d","DroiteHauteurPLante") %>% 
          str_replace("HauteurPLante...\\d","GaucheHauteurPLante") %>% 
          str_split(",",simplify = F) %>% flatten_chr()
       ## suppression des colonnes
       df <- df %>% select(-starts_with("colToDelete")) %>% 
          mutate(across(is.character,~ifelse(str_detect(.x,"^(NA|[0-9]+)"),
                                             str_replace(.x,"NA","") %>% as.numeric(),.x)))
     
    }
    resultat <- reduce(map(liste_fichiers,lire_fichier),bind_rows)
    View(resultat)

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

Discussions similaires

  1. Une boucle pour supprimer des lignes ?
    Par eldoir dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/04/2012, 18h43
  2. Réponses: 7
    Dernier message: 24/01/2012, 18h55
  3. [XL-2007] Créer une macro pour supprimer des onglets dans un autre classeur
    Par nicosd54 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/03/2011, 10h01
  4. Réponses: 7
    Dernier message: 09/02/2009, 14h28
  5. Requête pour supprimer des doublons dans une table
    Par nomade333 dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/03/2008, 12h48

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