Hackeando o R: extraindo dados de múltiplos arquivos no R

No Hackeando o R de hoje, vamos mostrar como criar dataframes organizados quando nossos dados estão quebrados em diversas planilhas. Esse é um problema comum ao tratar de dados que são padronizados porém possuem diversas fontes, e, na falta de uma API ou outro sistema de extração automatizada, acabamos tendo que baixar uma pasta com cada um dos arquivos. Abaixo, como exemplo motivador, vamos supor que queremos extrair a localização de cada uma das estações meteorológicas automatizadas no Brasil na malha do INMET. Os dados disponíveis no site são as observações de cada ano, logo poderíamos supor que para termos todas as estações, bastaria pegar o ano mais recente de dados (2020). Apesar disso, vamos utilizar múltiplos anos, para mostrar que também podemos trabalhar com dados que pertencem a múltiplas subpastas. Em uma pasta qualquer, as planilhas têm nomes identificadores:

Além disso, como mencionado anteriormente, os dados em cada planilha são padronizados, logo as transformações aplicadas em uma também funcionarão em todas as outras. Com isso, vamos ver o formato de uma delas:

Com isso, nosso procedimento vai ser o seguinte:
- Listar todos os nomes dos arquivos relevantes e os subdiretórios onde se encontram;
- Gerar uma função que extrai os dados de um arquivo qualquer;
- Aplicar a função sobre cada um dos arquivos e agregar os resultados.

O primeiro passo é o mais simples. Primeiramente, você deve garantir que está trabalhando no diretório onde se encontram os arquivos usando setwd(), ou colocando o seu script na mesma pasta e configurando no RStudio com
Session -> Set working directory -> To source file location
Após isso, podemos listar os dados com a função list.files(). Como queremos dados que estão em subpastas, utilizamos o argumento recursive=TRUE, que indica para o R que ele deve abrir as subpastas e pegar os nomes dos arquivos que estão lá. A pasta de trabalho também possui outros arquivos, porém apenas as planilhas começam com "INMET" no nome, logo utilizamos uma expressão regular na função com o argumento pattern. A expressão abaixo começa com ^, indicando que é o começo da string, e INMET, logo são listadas as strings que começam com INMET.

 

arquivos = list.files(pattern = '^INMET', recursive = TRUE)

Temos então 1794 arquivos distintos. Agora, vamos utilizar o tidyverse para extraírmos os dados que queremos. Nesse exemplo, eles serão as 7 primeiras linhas de cada planilha. O código abaixo gera uma função que abre um arquivo utilizando codificação latina (para termos acentos), transforma as 2 primeiras colunas em linhas, limpa os nomes, e transforma as variáveis numéricas que eram strings devido ao uso de vírgula para decimais em números do tipo double.

library(tidyverse)

extrator = function(dados){
read_csv2(dados, locale = locale(encoding = 'latin1'), n_max=7, col_names = FALSE) %>%
pivot_wider(names_from = X1, values_from = X2) %>%
rename('Região' = `REGIÃO:`, 'UF' = `UF:`, 'Código' = `CODIGO (WMO):`,
'Latitude' = `LATITUDE:`, 'Longitude' = `LONGITUDE:`,
'Estação' = `ESTAÇÃO:`, 'Altitude' = `ALTITUDE:`) %>%
mutate(across(Latitude:Altitude, function(x) as.numeric(gsub(',', '.', x))))
}

De posse da função, nos resta apenas aplicá-la sobre cada um dos arquivos. Para fazer isso, utilizaremos a função map() do pacote purrr, incluída no tidyverse. Como queremos gerar um único dataframe com cada um dos dados, e nossa função gera objetos com colunas de mesmo nome, iremos utilizar a função map_dfr, que aplica nossa função extrator() sobre cada objeto da lista arquivos, e os agrega linha por linha. É importante notar que a função será demorada, logo é bom testar com um conjunto pequeno antes de rodar sobre a lista completa. Ademais, como podemos ter repetição entre as estações, terminamos nosso código com a função unique(), que remove linhas iguais.

agregado = map_dfr(arquivos, extrator) %>% unique()

Abaixo, um excerto do resultado final:

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como Construir um Monitor de Política Monetária Automatizado com Python?

Descubra como transformar dados do Banco Central em inteligência de mercado com um Monitor de Política Monetária Automatizado. Neste artigo, exploramos o desenvolvimento de uma solução híbrida (Python + R) que integra análise de sentimento das atas do COPOM, cálculo da Regra de Taylor e monitoramento da taxa Selic. Aprenda a estruturar pipelines ETL eficientes e a visualizar insights econômicos em tempo real através de um dashboard interativo criado com Shiny, elevando o nível das suas decisões de investimento.

Qual o efeito de um choque de juros sobre a inadimplência?

Neste exercício, exploramos a relação dinâmica entre o custo do crédito (juros na ponta) e o risco realizado (taxa de inadimplência) através de uma análise exploratória de dados e modelagem econométrica utilizando a linguagem de programação R.

Qual a relação entre benefícios sociais e a taxa de participação do mercado de trabalho?

Este exercício apresenta uma investigação econométrica sobre a persistente estagnação da taxa de participação no mercado de trabalho brasileiro no período pós-pandemia. Utilizando a linguagem R e dados públicos do IBGE e Banco Central, construímos um modelo de regressão linear múltipla com correção de erros robustos (Newey-West). A análise testa a hipótese de que o aumento real das transferências de renda (Bolsa Família/Auxílio Brasil) elevou o salário de reserva, desincentivando o retorno à força de trabalho.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.