3 votes

Lire et manipuler de manière itérative plusieurs fichiers Excel et les ajouter dans un cadre de données à l'aide de R.

Dans un répertoire, j'ai plusieurs fichiers Excel avec un format similaire (vous pouvez télécharger des exemples de fichiers à partir de l'adresse suivante aquí ) :

enter image description here

Je vais devoir

  1. les fichiers de boucle et read_excel() ,
  2. muter une nouvelle colonne name avec le nom de la deuxième colonne,
  3. renommez la première et la deuxième colonne en date y value respectivement, supprimer la dernière colonne (dont le nom de colonne original est 1 ) ;
  4. ajouter tous les dfs à un cadre de données en utilisant do.call(rbind, df.list)

enter image description here

Ce que j'ai fait :

Pour boucler et récupérer les chemins des fichiers :

library(fs)
folder_path <- './test/'
file_paths <- dir_ls(folder_path, regexp = ".xlsx")

La fonction de lecture excelle :

read_excel_file <- function(path) {
  df <- read_excel(path = path, header = TRUE)
}

paresseux read_excel() à chaque fichier Excel :

df.list = lapply(file_paths, function(file) read_excel(file, skip = 2, col_names = FALSE))
df <- do.call(rbind, df.list)

Le résultat attendu sera un cadre de données comme celui-ci :

         date  value    name
2  2021-01-07  -76.5 J05-J01
3  2021-01-08  -93.5 J05-J01
4  2021-01-15   -305 J05-J01
5  2021-01-22    289 J05-J01
6  2021-01-29  242.5 J05-J01
7  2021-02-05    266 J05-J01
8  2021-02-10  239.5 J05-J01
9  2021-02-19  305.5 J05-J01
10 2021-01-07    323 J01-J09
11 2021-01-08  317.5 J01-J09
12 2021-01-15  527.5 J01-J09
13 2021-01-22    -51 J01-J09
14 2021-01-29  -58.5 J01-J09
15 2021-02-05    -76 J01-J09
16 2021-01-07   76.5 J01-J05
17 2021-01-08   93.5 J01-J05
18 2021-01-15    305 J01-J05
19 2021-01-22   -289 J01-J05
20 2021-01-29 -242.5 J01-J05
21 2021-02-05   -266 J01-J05
22 2021-02-10 -239.5 J01-J05

Comment pourrais-je y parvenir en utilisant R ? Merci beaucoup à l'avance.

5voto

Ozan147 Points 2193
library(dplyr)
library(readxl)

files <- list.files()

combined <- bind_rows(
  lapply(
    files,
    function(f) {
      df <- read_xlsx(f) 
      df %>%
        select(date = 1, value = 2) %>%
        mutate(name = colnames(df)[2])
    }
  ) 
)

Alternative par @ah bon :

read_file <- function(file) {
  df <- read_xlsx(file) 
  df <- df %>%
    select(date = 1, price = 2) %>%
    mutate(name = colnames(df)[2])
  return(df)
}

df <- bind_rows(
  lapply(
    files,
    read_file
  ) 
)

# or `df <- do.call(rbind, lapply(files, read_file))`

3voto

Marco_CH Points 133

Vous pouvez essayer :

library(fs)
library(readxl)

file_paths = list.files("./test/", pattern = "*.xlsx")

df = data.frame()

for(i in file_paths){
  df_temp = read_xlsx(path=paste0("./test/", i))
  df_temp$`1` = names(df_temp)[2]
  names(df_temp) = c("date", "value", "name")
  df = rbind(df, df_temp)
}

rm(df_temp)

Sortie :

> df
# A tibble: 21 x 3
   date                 value name   
   <dttm>               <dbl> <chr>  
 1 2021-01-07 00:00:00   76.5 J01-J05
 2 2021-01-08 00:00:00   93.5 J01-J05
 3 2021-01-15 00:00:00  305   J01-J05
 4 2021-01-22 00:00:00 -289   J01-J05
 5 2021-01-29 00:00:00 -242.  J01-J05
 6 2021-02-05 00:00:00 -266   J01-J05
 7 2021-02-10 00:00:00 -240.  J01-J05
 8 2021-01-07 00:00:00  323   J01-J09
 9 2021-01-08 00:00:00  318.  J01-J09
10 2021-01-15 00:00:00  528.  J01-J09
# ... with 11 more rows

Mise à jour avec fonction :

read_excel = function(name) {
  df_temp = read_xlsx(path=paste0("./test/", name))
  df_temp$`1` = names(df_temp)[2]
  names(df_temp) = c("date", "value", "name")
  return(df_temp)
}

df = do.call(rbind, lapply(file_paths, read_excel))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X