Este documento tem como objetivo contribuir para o entendimento de programação em R sobre os seguintes temas:
csv
, xlsx
e txt
;csv
, xlsx
e txt
Basicamente, é um resumo do curso Importing Data in R (Part 1) do DataCamp (2018c). Recomendo que você faça o curso para um entendimento mais detalhado dos temas estudados. Caso queira aprofundar sobre o assunto, você pode fazer os cursos Importing Data in R (Part 2) e Importing & Cleaning Data in R: Case Studies.
Podemos importar dados para o R de diferentes formas. O formato mais adequado dependerá do tamanho dos dados, se os dados já existem em um arquivo ou se digitaremos diretamente no R.
Para o caso onde temos um arquivo, temos as opções abaixo, por exemplo:
csv
: O Comma Separated Value (csv) é um dos formatos mais utilizados para armazenar informações em formato de tabela. Nele a vírgula indica a passagem para a próxima coluna. A tabela pode ter um cabeçalho (header) com os nomes das colunas ou não;xlsx
: Formato de arquivos em Excel. Há a opção de salvar via Excel em csv
e fazer a leitura neste formato ou fazer usar um pacote específico do R que faz a leitura em xlsx
.txt
: Formato de arquivos de texto. Um arquivo de texto pode conter, por exemplo, tweets que você deseja analisar, um em cada linha.################################
#### PACOTES DO R #####
################################
# Instalar pacotes necessários
install.packages(c("tidyverse","nycflights13","jsonlite","httr","Quandl","magrittr","highcharter"))
# Carregar os pacotes no ambiente
suppressMessages(require(readr)) # usado para fazer a leitura de dados csv e txt
suppressMessages(require(readxl)) # usado para fazer leitura de dados xls ou xlsx
suppressMessages(require(nycflights13)) # usado para coletar dados tomados como exemplo
suppressMessages(require(jsonlite)) # usado para fazer a leitura de dados em JSON
suppressMessages(require(httr)) # usado para fazer requisições às APIs
suppressMessages(require(Quandl)) # usado para coletar dados do site https://www.quandl.com/
suppressMessages(require(magrittr)) # usado para operações em pipeline
suppressMessages(require(highcharter)) # usado para gerar os gráficos
################################
#### DIGITANDO NO R #####
################################
# Criando um data frame com endereço de piscinas
swimming_pools <- structure(list(Name = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 19L,
7L, 8L, 9L, 10L, 11L, 13L, 14L, 15L, 16L, 17L, 18L, 12L, 20L), .Label = c("Acacia Ridge Leisure Centre",
"Bellbowrie Pool", "Carole Park", "Centenary Pool (inner City)",
"Chermside Pool", "Colmslie Pool (Morningside)", "Dunlop Park Pool (Corinda)",
"Fortitude Valley Pool", "Hibiscus Sports Complex (upper MtGravatt)",
"Ithaca Pool ( Paddington)", "Jindalee Pool", "Langlands Parks Pool (Stones Corner)",
"Manly Pool", "Mt Gravatt East Aquatic Centre", "Musgrave Park Pool (South Brisbane)",
"Newmarket Pool", "Runcorn Pool", "Sandgate Pool", "Spring Hill Baths (inner City)",
"Yeronga Park Pool"), class = "factor"), Address = structure(c(5L,
20L, 18L, 10L, 9L, 11L, 6L, 15L, 12L, 17L, 4L, 3L, 1L, 19L, 2L,
14L, 8L, 7L, 13L, 16L), .Label = c("1 Fairlead Crescent, Manly",
"100 Edmonstone Street, South Brisbane", "11 Yallambee Road, Jindalee",
"131 Caxton Street, Paddington", "1391 Beaudesert Road, Acacia Ridge",
"14 Torrington Street, Springhill", "231 Flinders Parade, Sandgate",
"37 Bonemill Road, Runcorn", "375 Hamilton Road, Chermside",
"400 Gregory Terrace, Spring Hill", "400 Lytton Road, Morningside",
"432 Wickham Street, Fortitude Valley", "5 Panitya Street, Stones Corner",
"71 Alderson Stret, Newmarket", "794 Oxley Road, Corinda", "81 School Road, Yeronga",
"90 Klumpp Road, Upper Mount Gravatt", "Cnr Boundary Road and Waterford Road Wacol",
"Cnr wecker Road and Newnham Road, Mansfield", "Sugarwood Street, Bellbowrie"
), class = "factor"), Latitude = c(-27.58616, -27.565466, -27.607439,
-27.455369, -27.385829, -27.45516, -27.459596, -27.546519, -27.4539,
-27.551826, -27.462262, -27.532363, -27.452285, -27.532135, -27.479777,
-27.42968, -27.591561, -27.311956, -27.497689, -27.520527), Longitude = c(153.026354,
152.891082, 152.931511, 153.025067, 153.035109, 153.078861, 153.021548,
152.980628, 153.0368, 153.07354, 153.010347, 152.942691, 153.187437,
153.094289, 153.016806, 153.006206, 153.076415, 153.069098, 153.04867,
153.018544)), .Names = c("Name", "Address", "Latitude", "Longitude"
), class = "data.frame", row.names = c(NA, -20L))
# Exemplo de como os dados são armazenados
head(swimming_pools)
# Name Address Latitude Longitude
# Acacia Ridge Leisure Centre 1391 Beaudesert Road, Acacia Ridge -27.58616 153.0264
# Bellbowrie Pool Sugarwood Street, Bellbowrie -27.56547 152.8911
# Carole Park Cnr Boundary Road and Waterford Road Wacol -27.60744 152.9315
# Centenary Pool (inner City) 400 Gregory Terrace, Spring Hill -27.45537 153.0251
# Chermside Pool 375 Hamilton Road, Chermside -27.38583 153.0351
# Colmslie Pool (Morningside) 400 Lytton Road, Morningside -27.45516 153.0789
################################
#### LEITURA DE UM CSV #####
################################
# Dados meteorológicos por hora para os aeroportos LGA, JFK e EWR
data(weather, package = "nycflights13")
# Local temporário onde os arquivos serão salvos
weather_csv <- tempfile()
# Salvar os dados como um csv
readr::write_csv(weather, weather_csv)
# Leitura do arquivo csv deixando a função definir o tipo de cada coluna
read_weather_csv <- readr::read_csv(weather_csv)
# Leitura do arquivo csv especificando o tipo de cada coluna
read_weather_csv_type_cols <- readr::read_csv(weather_csv, col_types = cols(
origin = col_character(),
year = col_integer(),
month = col_integer(),
day = col_integer(),
hour = col_integer(),
temp = col_double(),
dewp = col_double(),
humid = col_double(),
wind_dir = col_integer(),
wind_speed = col_double(),
wind_gust = col_double(),
precip = col_double(),
pressure = col_double(),
visib = col_double(),
time_hour = col_datetime(format = "")
))
# Acesse http://readr.tidyverse.org/index.html para entender outras funcionalidades
################################
#### LEITURA DE UM TXT #####
################################
# Local temporário onde os arquivos serão salvos
weather_txt <- tempfile()
# Salvar os dados como um txt
readr::write_delim(weather, weather_txt, delim = '\t', col_names=TRUE)
# Leitura do arquivo txt deixando a função definir o tipo de cada coluna
read_weather_txt <- readr::read_delim(weather_txt, delim = "\t")
# Leitura do arquivo txt especificando o tipo de cada coluna
read_weather_txt_type_cols <- readr::read_delim(weather_txt, delim = "\t", col_types = cols(
origin = col_character(),
year = col_integer(),
month = col_integer(),
day = col_integer(),
hour = col_integer(),
temp = col_double(),
dewp = col_double(),
humid = col_double(),
wind_dir = col_integer(),
wind_speed = col_double(),
wind_gust = col_double(),
precip = col_double(),
pressure = col_double(),
visib = col_double(),
time_hour = col_datetime(format = "")
))
# Acesse http://readr.tidyverse.org/index.html para entender outras funcionalidades
################################
#### LEITURA DE UM XLSX #####
################################
# Exemplo de arquivos xlsx que são armazenados no R ao instalar o pacote tidyverse
readxl::readxl_example()
# "clippy.xls" "clippy.xlsx" "datasets.xls" "datasets.xlsx" "deaths.xls" "deaths.xlsx"
# "geometry.xls" "geometry.xlsx" "type-me.xls" "type-me.xlsx"
# Local onde um arquivo específico da lista acima está salvo
xlsx_example <- readxl::readxl_example("datasets.xls")
# Planilhas contidas no arquivo
readxl::excel_sheets(xlsx_example)
# "iris" "mtcars" "chickwts" "quakes"
# Fazer a leitura de uma planilha específica
read_chickwts_excel <- readxl::read_excel(xlsx_example, sheet = "chickwts") # usando o nome
read_quakes_excel <- readxl::read_excel(xlsx_example, sheet = 4) # usando a posição
# Acesse http://readxl.tidyverse.org/index.html para entender outras funcionalidades
Até o momento, estávamos utilizando dados armazenados em nossos computadores/notebooks. Porém, temos casos onde os arquivos de dados estão armazenados na internet (seja em buckets ou em sites).
Você pode não estar interessado em fazer o download do arquivo para seu computador em função do arquivo é atualizado constantemente e você não quer repetir a tarefa de fazer o download do arquivo toda vez que o dado for atualizado. Outra hipótese é simplesmente pelo fator de não ficar armazenando dados no seu computador, mas sim em um serviço qualquer (Google Drive, OneDrive, Dropbox, S3, …).
Em função disto, temos a alternativa de executar a leitura do arquivo diretamente da internet como mostramos abaixo.
################################
#### LEITURA DE UM CSV #####
################################
# URL do arquivo csv
url_csv <- "https://s3.amazonaws.com/assets.datacamp.com/production/course_1478/datasets/swimming_pools.csv"
# Leitura do arquivo csv deixando a função definir o tipo de cada coluna
read_weather_csv_from_web <- readr::read_csv(url_csv)
# Leitura do arquivo csv especificando o tipo de cada coluna
read_weather_csv_from_web_type_cols <- readr::read_csv(url_csv, col_types = cols(
Name = col_character(),
Address = col_character(),
Latitude = col_double(),
Longitude = col_double()
))
# Acesse http://readr.tidyverse.org/index.html para entender outras funcionalidades
################################
#### LEITURA DE UM TXT #####
################################
# URL do arquivo txt
url_txt <- "http://s3.amazonaws.com/assets.datacamp.com/production/course_1478/datasets/potatoes.txt"
# Leitura do arquivo txt deixando a função definir o tipo de cada coluna
read_weather_txt_from_web <- readr::read_delim(url_txt, delim = "\t")
# Leitura do arquivo csv especificando o tipo de cada coluna
read_weather_txt_from_web_type_cols <- readr::read_delim(url_txt, delim = "\t", col_types = cols(
area = col_integer(),
temp = col_integer(),
size = col_integer(),
storage = col_integer(),
method = col_integer(),
texture = col_double(),
flavor = col_double(),
moistness = col_double()
))
# Acesse http://readr.tidyverse.org/index.html para entender outras funcionalidades
Com o advento da computação em nuvem e a grande quantidade de dados disponíveis, as empresas e órgãos públicos buscaram uma alternativa para disponibilização de seus dados que seja mais padronizada e de melhor gestão.
Surgiu então as APIs que nada mais é que um conjunto de rotinas e padrões de programação para acesso a um aplicativo de software ou plataforma baseado na Web. A sigla API refere-se ao termo em inglês Application Programming Interface que significa em tradução para o português “Interface de Programação de Aplicativos”. Exemplo disso são empresas como Facebook, Google, Twitter, LinkedIn ou até mesmo o Governo (Data.gov, IBGE, …) que conseguem entregar seus dados por meio de APIs. A maioria dessas APIs usam uma interface RESTful o que significa que enviaremos/receberemos dados no formato de um JSON usando comandos HTTP.
No R também podemos fazer uso dessa tecnologia para acessar dados. Para tanto, em qualquer API temos os seguintes passos:
toJSON
no pacote jsonlite
para criar a requisiçãohttr
;
GET
: toda informação é enviada para o sistema de destino junto ao endereço do sistema (URL).POST
: informação é enviada de forma mais escondida e não irá aparecer na URL.fromJSON
do pacote jsonlite
;Abaixo, mostramos como fazer isso usando algumas APIs bem conhecidas.
################################
#### QUANDL API #####
################################
# Passos necessários antes de continuar com o códigoa baixo
# 1. Acesse https://www.quandl.com/
# 2. Crie uma conta no site
# 3. Obtenha uma API Key
# 4. Adicione sua API Key nos parâmetros abaixo
# Parâmetros para a consulta (opções disponíveis em https://docs.quandl.com/docs/parameters-2)
data.inicio <- "1996-01-01"
data.fim <- as.character(Sys.Date())
codigo_banco_dados <-"BCB"
codigo_serie <- "4189"
tipo_serie <- "ts"
tipo_dado<- ".json"
api_key <- "xvSrAztygUphvYp9q1bs"
Quandl.api_key(api_key)
#######
#### USANDO O PACOTE
#######
# BCB/4189 É A TAXA SELIC ACUMULADA NO MÊS EM TERMOS ANUAIS - MENSAL
selic.m <- Quandl::Quandl(paste0(codigo_banco_dados, "/", codigo_serie), type = tipo_serie, collapse = "monthly", start_date = data.inicio, end_date = data.fim)
#######
#### USANDO A API
#######
# URL da série de interesse
selic_quandl_url <- paste0("https://www.quandl.com/api/v3/datasets/", codigo_banco_dados, "/", codigo_serie, tipo_dado, "?", "api_key=", api_key, "&", "start_date=", data.inicio)
# Fazer a requisição e coletar os dados
selic_quandl_data <- jsonlite::fromJSON(selic_quandl_url)
# Outra opção
selic_quandl_data <- httr::content(httr::GET(selic_quandl_url))
Abaixo, o gráfico dos dados da SELIC coletados usando a API do Quandl.
DataCamp, Inc. 2018a. “How to Work with Quandl in R.” https://www.datacamp.com/community/open-courses/quandl-r-tutorial.
———. 2018b. “Importing & Cleaning Data in R - Case Studies.” https://www.datacamp.com/courses/importing-cleaning-data-in-r-case-studies.
———. 2018c. “Importing Data in R (Part 1).” https://www.datacamp.com/courses/importing-data-in-r-part-1.
———. 2018d. “Importing Data in R (Part 2).” https://www.datacamp.com/courses/importing-data-in-r-part-2.
Wickham, Hadley. 2014. Advanced R. CRC Press.
Wickham, Hadley, and Garrett Grolemund. 2016. R for Data Science - Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media, Inc.
2018. “Curso-R.” http://material.curso-r.com/.