Como importar múltiplos csv para o mesmo dataframe

R
data wrangling
readr
Autor

Lucas Carmo

Publicado

2024 - 02 - 27

tl;dr

Imagine que você tem 200 arquivos em uma diretório no seu computador e precisa importar todos eles para criar uma visualização. Vou te ensinar a fazer isso da forma mais simples possível.

Definições

Gostaria de dar algumas definições para que possa usar os termos corretos

Diretório
Comumente chamado de ‘pasta’, é o local onde os arquivos estão localizados
Caminho
Endereço do arquivo completo que inclui a extensão do arquivo

Inspiracão

Durante o meu mestrado eu realizei mais de 500 experimentos em reologia e eu sabia que para organizar estas análises seria necessário organizar meus arquivos de uma forma padronizada para que eu pudesse acessar os dados rapidamente. Naquela época eu não sabia nada sobre banco de dados mas eu conhecia bem .csv e como a maioria dos softwares de equipamentos analíticos exporta desta forma eu sabia que poderia fazer funcionar.

O problema é que eu precisaria importar centenas de documentos .csv para poder gerar as vizualizações e análises, mas a alternativa era fazê-lo no excel 😓.

Solução

A solução envolveu algumas etapas:

  1. Nomear os meus documentos muito bem e de forma padronizada
  2. Incluir o máximo de informações no cabeçalho dos documentos
  3. Sempre exportar da mesma forma
  4. Salvar os documentos de forma organizada nos diretórios apropriados

Um exemplo de documento exportado é o demonstrado abaixo:

C:\Documents\E_AS_a_1d.rwd
Company / Operator: / lucas
Date / Time / Version: 16.01.2019 / 16:58:44 / 4.30.0030
Substance / Sample no: E_AS_a_1d / a

   ;   t in s;  Tau in Pa;  G' in Pa;   G'' in Pa;  T in °C; 
1|1;   3,03816; 0,01000000; 287,874;    5510,48;    24,8900; 
1|2;   4,77336; 0,0111549;  1217,39;    2093,46;    24,8900; 
1|3;   6,43109; 0,0124431;  1526,54;    1898,83;    24,8900; 
1|4;   8,02304; 0,0138801;  1491,70;    2424,77;    24,8900;
1|5;   9,74107; 0,0154831;  1607,40;    2188,76;    24,8900;
1|6;   11,3822; 0,0172712;  1615,57;    3013,40;    24,8900;
1|7;   13,0230; 0,0192658;  4972,53;    4013,37;    24,8900;

Perceba que há várias informações valiosas como a data, hora e nome da amostra nas primeiras linhas do documento e o restante são dados formatados usando vírgula (,) como decimal e ponto e vírgula (;) como separador de colunas. Esta informação é importante.

readr

Eu já vou dar a dica de que o readr:: é a melhor library para trabalhar com a grande maioria dos dados e convenientemente, as funções de leitura de dados aceita múltiplos documentos por padrão no momento da importação.

Imagine que eu tenho 3 arquivos .csv dentro do diretório importar-multiplos-csv que tem um caminho conforme o seguinte C:\Documentos\posts\importar-multiplos-csv.

Este arquivo possui a formatação como abaixo:

linha;nome;sexo;valor
1;Alberto;M;55
2;Alberto;M;56
3;Alberto;M;49
4;Alberto;M;50
5;Alberto;M;52
6;Alberto;M;59
7;Alberto;M;60
8;Alberto;M;61
9;Alberto;M;65
10;Alberto;M;70

Usando o pacote here:: é mais fácil selecionar o caminho completo do diretório.

library(readr)
library(here)

# Encontrar o caminho para a diretório onde estão os meus arquivos csv
diretorio <- here("posts", "importar-multiplos-csv")

# Cria uma lista dos arquivos csv que estão na diretório indicado 
lista_arquivos <- dir(path = diretorio, pattern = "csv", full.names = TRUE)

df <- read_csv(file = lista_arquivos)

print(df)
# A tibble: 30 × 1
   `linha;nome;sexo;valor`
   <chr>                  
 1 1;Alberto;M;55         
 2 2;Alberto;M;56         
 3 3;Alberto;M;49         
 4 4;Alberto;M;50         
 5 5;Alberto;M;52         
 6 6;Alberto;M;59         
 7 7;Alberto;M;60         
 8 8;Alberto;M;61         
 9 9;Alberto;M;65         
10 10;Alberto;M;70        
# ℹ 20 more rows

Essencialmente, tendo um vetor com os caminhos dos arquivos, basta passar essa lista para a função read_csv() e todos os arquivos serão importados.

Da forma que executei as ações todos os dados foram incluídos em apenas uma coluna. Isso acontece porque por padrão read_csv() entende a vírgula , como divisor de colunas e . como ponto decimal mas os dados que eu apresentei usam ; como divisor de colunas e , como ponto decimal, causando confusão no momento de identificar os valores.

Como é comum o uso de , como ponto decimal em vários países os desenvolvedores do readr:: também criaram a função read_csv2() que entende como divisor de colunas o ; e , como ponto decimal.

Adicionalmente há a função read_delim() onde é possível especificar qualquer caractere como divisor de colunas como | e outros. Há outras funções da família do read_*() que podem ser lidos na documentação da library.

Repetindo a leitura dos dados com a função correta, obtém-se as colunas separadas corretamente.

Code
df <- read_csv2(
   file = lista_arquivos
   )

print(df, n=30)
# A tibble: 30 × 4
   linha nome    sexo  valor
   <dbl> <chr>   <chr> <dbl>
 1     1 Alberto M        55
 2     2 Alberto M        56
 3     3 Alberto M        49
 4     4 Alberto M        50
 5     5 Alberto M        52
 6     6 Alberto M        59
 7     7 Alberto M        60
 8     8 Alberto M        61
 9     9 Alberto M        65
10    10 Alberto M        70
11     1 Laura   F        45
12     2 Laura   F        45
13     3 Laura   F        46
14     4 Laura   F        46
15     5 Laura   F        47
16     6 Laura   F        45
17     7 Laura   F        44
18     8 Laura   F        43
19     9 Laura   F        42
20    10 Laura   F        45
21     1 Jonas   M        80
22     2 Jonas   M        82
23     3 Jonas   M        83
24     4 Jonas   M        86
25     5 Jonas   M        89
26     6 Jonas   M        90
27     7 Jonas   M        95
28     8 Jonas   M       101
29     9 Jonas   M       103
30    10 Jonas   M       110

Representado graficamente como abaixo.

linha nome sexo valor
1 Alberto M 55
2 Alberto M 56
3 Alberto M 49
4 Alberto M 50
5 Alberto M 52
6 Alberto M 59
7 Alberto M 60
8 Alberto M 61
9 Alberto M 65
10 Alberto M 70
1 Laura F 45
2 Laura F 45
3 Laura F 46
4 Laura F 46
5 Laura F 47
6 Laura F 45
7 Laura F 44
8 Laura F 43
9 Laura F 42
10 Laura F 45
1 Jonas M 80
2 Jonas M 82
3 Jonas M 83
4 Jonas M 86
5 Jonas M 89
6 Jonas M 90
7 Jonas M 95
8 Jonas M 101
9 Jonas M 103
10 Jonas M 110