Kit de sobrevivência em R - Parte 4: Carregando Dados

Seguindo a sequência do Kit de sobrevivência em R, vamos abordar um pouco sobre uma das partes iniciais de qualquer análise ou trabalho que vá ser feito no R: carregamento e leitura de dados. Nesse post você irá aprender formas básicas de carregar dados e começar os trabalhos.

Estrutura dos dados

Eis aqui uma notícia ruim: não existe um padrão dominante para armazenamento de dados. O que isso significa? Significa que, na vida real, você vai se deparar com os mais diferentes tipos de fontes de dados e mesmo assim vai ter que dar um jeito de analisá-las e estudá-las para concluir seus trabalhos.

Ou seja, existem diversas formas de carregar dados para trabalhar com eles no R. Em prol da objetividade, vamos tratar dos casos mais comuns e mais básicos primeiro. Esse assunto pode ser extremamente vasto, então, criaremos primeiro uma base para, em posts futuros, aprofundarmos em fontes de dados mais complexas.

De maneira geral, você irá encontrar dados disponibilizados basicamente em três formas básicas: estruturados, não estruturados e semi-estruturados.

Dados Estruturados

Basicamente são conjuntos de informações organizadas em colunas (atributos, variáveis, features, etc.) e linhas (registros, itens, observações, etc.). São dados encontrados em bancos de dados, arquivos com algum tipo de separação entre as colunas, excel, arquivos com campos de tamanho fixo, etc.

Dados não estruturados

Como o nome diz, não tem um estrutura previsível, ou seja, cada arquivo possui uma forma única de ser carregado e manejado. Geralmente são arquivos com forte teor textual. Podemos citar, por exemplo, emails, twitters, PDFs, imagens, etc. Muito usados em mineração de dados.

Dados semi-estruturados

Também possuem estrutura fixa, porém, não seguem o padrão de estrutura linha/coluna, ou seja, é uma estrutura mais complexa e flexível, geralmente hierárquica, estruturada em tags ou marcadores de campos. São exemplos de arquivos semi-estruturados: JSON, XML, HTML, YAML, etc. É o formato mais usado em troca de dados pela internet e consumo de APIs.

Trataremos primeiro dos arquivos estruturados. Em futuros posts vamos abordar os outros tipos, pois são abordagens um pouco mais complexas e é sempre bom começar pelo básico!

Preparando o ambiente para começar

Limpando tudo

Antes de começar os trabalhos, é uma boa prática ter certeza de que seu ambiente de trabalho está limpo. Um simples comando garante que está tudo limpo pronto para começar:


 rm(list=ls())

Esse comando na verdade está usando duas funções:

As duas funções conjugadas dão a ordem de remover tudo que estiver na lista de objetos da sessão do R.

Pronto. Seus ambiente está limpo.

Definindo diretório de trabalho

O R vai “ler” os dados de algum lugar do seu computador. Normalmente o R inicia lendo em um diretório padrão, mas nem sempre os arquivos estarão nesse mesmo diretório. Para dizer ao R onde ele deve ler os arquivos, usaremos o comando set working directory:


 setwd("Local/Do/Seus/Arquivos/De/Trabalho/")

Também pode ser realizado pelos menus do RStudio em Session > Set Working Directory > Choose Directory... e escolha a pasta onde seus arquivos de dado estarão.

alt Definindo o diretório de trabalho
alt Definindo o diretório de trabalho

Para saber qual o diretório de trabalho está atualmente definido, use o comando getwd().

Caso você não deseje alterar o diretório de trabalho, também há a opção de ser informado o caminho completo do arquivo (caminho absoluto).

Ok! Agora sim!

Tipos de carregamento

O R possui algumas funções básicas de carregamento. Essas funções tratam de alguns tipos de arquivo, basicamente diferenciados pelo delimitador. Outro aspecto importante é que essas funções básicas pressupõem que cada linha representa um novo registro de dados.

Para ficar mais claro, delimitadores podem ser qualquer coisa que seja usada para separar dados. Por exemplo, os arquivos podem ser separados por vírgulas (CSV - Comma-separated values), por ponto e vírgula (;), por espaçamento TAB (a tecla TAB do teclado mesmo!), por espaços simples ou qualquer outro tipo de símbolo.

E quando não existe delimitador, ou seja, quando os campos estão “colados” uns nos outros? Em alguns casos, arquivos são confeccionados com um tamanho fixo para cada coluna (principalmente em arquivos gigantescos!), e cada linha respeita tamanhos específicos para separar os seus registros.

Como dissemos antes, dados estruturados possuem colunas e linhas (ou atributos e registros, ou variáveis e observações… dá na mesma!). O delimitador é uma forma de separar o conteúdo de cada linha em uma coluna específica. Ficará mais claro a seguir.

Para replicar os exemplos abaixo, baixe este arquivo zip com exemplos de dados em que foram usados diferentes delimitadores. Descompacte o arquivo em alguma pasta do seu computador. Defina esta pasta como o seu diretório de trabalho no RStudio. Além disso, dê uma olhada nos arquivos com o auxílio do bloco de notas ou outro programa para que você tenha ideia como o dado está inicialmente estruturado.

Carregando os dados

Dividiremos este tópico em duas partes: dados delimitados e dados com campos de tamanho fixo.

Dados com delimitadores

Para importar dados com delimitadores utilizaremos a função read.table(). Essa função permite definir qualquer delimitador para a leitura do arquivo, conforme os exemplos abaixo.


# Separado por tabulação
dados.tab <- read.table('desemprego_uf_tab.txt', sep = "\t", dec = ",", header = TRUE) 
# Separado por ;
dados.ponto.virgula <- read.table('desemprego_uf_ponto_virgula.txt', sep = ";", dec = ",", header = TRUE) 
# Separado por espaço
dados.espaco <- read.table('desemprego_uf_espaco.txt', sep = " ", dec = ",", header = TRUE) 

Reparem no parâmetro header = TRUE, isso significa dizer que a primeira linha do arquivo contem o nome das colunas, ou seja, não é um dado propriamente dito, e sim um metadado pois é uma informação sobre os registros. Caso seu arquivo não contenha o nome das colunas, basta usar header = FALSE.

Após o carregamento, vamos usar a função head()para ver a “cara” dos nossos dados. Veja que eles são iguais nos três casos. Nessa função, você pode especificar o número de linhas que deseja ver. Por exemplo: head(dados.tab, 10). Para visualizar as últimas linhas, você pode utilizar o tail() da mesma forma. Note que o RStudio tem funcionalidades que permitem que você visualize os dados como uma planilha. Basta clicar no nome do objeto que está listado na aba Environment.


head(dados.tab)

   Ano   Trimestre       UF Taxa_Desemprego
1 2012 jan-fev-mar Rondônia           8.008
2 2012 abr-mai-jun Rondônia           6.224
3 2012 jul-ago-set Rondônia           5.882
4 2012 out-nov-dez Rondônia           5.274
5 2013 jan-fev-mar Rondônia           6.114
6 2013 abr-mai-jun Rondônia           4.771

head(dados.ponto.virgula)

   Ano   Trimestre       UF Taxa_Desemprego
1 2012 jan-fev-mar Rondônia           8.008
2 2012 abr-mai-jun Rondônia           6.224
3 2012 jul-ago-set Rondônia           5.882
4 2012 out-nov-dez Rondônia           5.274
5 2013 jan-fev-mar Rondônia           6.114
6 2013 abr-mai-jun Rondônia           4.771

head(dados.espaco)

   Ano   Trimestre       UF Taxa_Desemprego
1 2012 jan-fev-mar Rondônia           8.008
2 2012 abr-mai-jun Rondônia           6.224
3 2012 jul-ago-set Rondônia           5.882
4 2012 out-nov-dez Rondônia           5.274
5 2013 jan-fev-mar Rondônia           6.114
6 2013 abr-mai-jun Rondônia           4.771

tail(dados.espaco, 4)

     Ano   Trimestre               UF Taxa_Desemprego
429 2015 jan-fev-mar Distrito Federal          10.784
430 2015 abr-mai-jun Distrito Federal           9.627
431 2015 jul-ago-set Distrito Federal          10.258
432 2015 out-nov-dez Distrito Federal           9.707

Dados com campos de tamanho fixo

Para a leitura de dados desse tipo, você precisa saber previamente o tamanho de caracteres reservado para cada campo. Geralmente esse tipo de arquivo vem acompanhando de um arquivo auxiliar explicando o layout dos dados.


dados.fwf <- read.fwf('desemprego_uf_fwf.txt', widths = c(4, 11, 19, 6),  header = FALSE,  strip.white = TRUE)

Reparem que o segundo parâmetro da função, widths é onde você especifica o tamanho de cada campo na ordem em que eles ocorrem na linha. Ou seja, o primeiro campo tem tamanho 4 e o segundo 11. O strip.white = TRUE é a opção para eliminar os espaços em branco que foram incluídos na criação do arquivo para que cada linha tivesse o tamanho total especificado para cada coluna.

O que é esse c()? É uma função que cria um vetor. Explicaremos detalhadamente sobre isso em outro post!

E onde está o header = TRUE? Geralmente arquivos com campos de tamanho fixo não possuem uma linha indicando o cabeçalho. Como dito, esses arquivos costumam vir acompanhados de um arquivo de layout explicando os dados, inclusive o que cada campo significa.

Se olharmos os dados, veremos que o R atribuiu nomes genéricos para as variáveis.


head(dados.fwf)

    V1          V2       V3    V4
1 2012 jan-fev-mar Rondônia 8.008
2 2012 abr-mai-jun Rondônia 6.224
3 2012 jul-ago-set Rondônia 5.882
4 2012 out-nov-dez Rondônia 5.274
5 2013 jan-fev-mar Rondônia 6.114
6 2013 abr-mai-jun Rondônia 4.771

Para definirmos os nomes das variáveis usaremos o comando colnames(). Basicamente, diremos que os nomes das colunas deverão ser os que estão especificados abaixo:


colnames(dados.fwf) <- c('Ano', 'Trimestre', 'UF', 'Taxa_Desemprego')
head(dados.fwf)

   Ano   Trimestre       UF Taxa_Desemprego
1 2012 jan-fev-mar Rondônia           8.008
2 2012 abr-mai-jun Rondônia           6.224
3 2012 jul-ago-set Rondônia           5.882
4 2012 out-nov-dez Rondônia           5.274
5 2013 jan-fev-mar Rondônia           6.114
6 2013 abr-mai-jun Rondônia           4.771

Mais opções na leitura

Apresentamos as funções básicas de leitura de arquivo com seu uso padrão mais simples. No entanto, existem muitos outros parâmetros que podem ser usados para especificar mais a leitura dos dados. Vale a pena conferir. Para conhecer mais sobre as funções apresentadas, lembrem-se de usar ?.


?read.table()
?read.fwf()
?read.delim()
?read.csv()

Dica: Repare que read.delim() e read.csv() estão na mesma ajuda do read.table(). Na verdade todas as 3 funções são a mesma, e podem ser reproduzidas com o read.table() apenas mudando alguns parâmetros na chamada da função.

Outras formas de carregar dados

Existe diversas outras formas de carregar dados. Mas nosso objetivo aqui é apenas criar uma introdução para conseguir carregar a grande maioria dos formatos de dados mais comuns.

Em breve lançaremos posts explicando leitura de arquivos em excel, arquivos semi-estruturados e arquivos não estruturados.

Desafio

Que tal tentar carregar e visualizar no R os dados da série histórica das taxas de vendas de títulos do tesouro direto (download Tesouro Direto)?

Tente também carregar e visualizar os dados do IPCA (Índice Nacional de Preço ao Consumidor Amplo), indicador oficial da inflação brasileira (download IPCA).

Teve alguma dificuldade? Comente abaixo para que possamos ajudar!

Referências:

Demais posts da sequência: