Tutorial 2: Introdução ao R

Workflow: RStudio e Scripts.

O que é o R?

R é uma linguagem de programação de código aberto, versátil, útil tanto para estatística quanto para ciência de dados. É Inspirada na linguagem de programação S. Essas são algumas das principais vantagens do R:

  • Software de código aberto.
  • Superior (se não apenas comparável) às alternativas comerciais. Em janeiro de 2019, R ocupava o 12º lugar no índice TIOBE, que mede a popularidade das linguagens de programação. É amplamente utilizado na academia e na indústria, especialmente no círculo de cientistas de dados.
  • Disponível em todas as plataformas (Unix, Windows, Linux).
  • Como resultado de ser uma linguagem de dados aberta, se você fizer sua análise em R, qualquer pessoa poderá replicá-la facilmente.
  • Funciona não apenas para análise estatística, mas também programação de uso geral.
  • É linguagem de objetos (= R possui objetos) e funcional (= Você pode escrever funções).
  • Grande e crescente comunidade de usuários.

Rstudio

O RStudio é a principal interface gráfica do usuário (GUI) e o ambiente de desenvolvimento integrado (IDE) que facilita o uso do R.

Como escrever códigos em R?

A maior parte dos usuários iniciantes em R costuma digitar seus códigos diretamente na linha de comando. Esta é uma péssimoa opção.

A melhor forma para trabalhar com R consiste em utilizar scripts. Estes scripts – que não são nada mais do que um arquivo de texto – permite a você contruir seu código de forma mais integrada, e com mais flexibilidade.

Vamos revisar como funciona o R Studio, para entender melhor a utilização de scripts, e fluxos básicos de programação em R.

Noções básicas.

Abra o RStudio! Em seguida, abra um novo script clicando em “Arquivo -> Novo arquivo -> Script R” ou pressionando Ctrl + Shift + N (PC) oucommand + shift + N (Mac). Depois de abrir um novo script, você verá quatro “painéis”.

Painel superior esquerdo (entrada / script)

Neste painel, você escreve seu código. Digite 2 + 2 no seu script e execute uma linha de código pressionandocommand + enter (Mac) ou Ctrl + enter (PC). Ou clique no botão “Executar” na parte superior do script.

O nome do seu arquivo de script está na guia na parte superior da janela do script - o nome padrão é Untitled1. Certifique-se de salvar seu script clicando em “Arquivo -> Salvar” ou command + s (Mac) ouCtrl + s (PC). Você também pode clicar no ícone de disquete para salvar.

Painel inferior esquerdo (saída / console)

O resultado do código é exibido no `console ’no painel inferior esquerdo. Esse espaço também é bom para procurar e experimentar o código que você não deseja salvar em seu script.

Painel superior direito (ambiente global)

Os dados são salvos na memória de R como objetos. Os objetos são simplesmente espaços reservados para um valor, expressão matemática, palavra, função ou conjunto de dados! A guia “Ambiente” global no painel superior direito exibe as variáveis que você atribuiu / salvou.

Painel inferior direito (arquivos, plotagens, pacotes e ajuda)

Aqui você encontra guias úteis para navegar no sistema de arquivos, exibir gráficos, instalar pacotes e visualizar páginas de ajuda. Pressione a tecla control e um número (1 a 9) no teclado para atalho entre esses painéis e guias.

Como Interagir com R

Há duas formas para interagir com R via R Studio.

  • Via Console (Tela Inferior Esquerda).

  • Via Script. (Tela Superior Esquerda)

R via console.

No console, o prompt > indica que seu R está pronto para receber o comando. Copie e cole o código abaixo em seu Console e click Enter.

2+2
## [1] 4

Se o seu prompt estiver com símbolo +, basta clicar no console e pressionar a tecla esc no teclado quantas vezes forem necessárias para retornar ao prompt. O R usa + quando o código é dividido em várias linhas e o prompt ainda espera mais código.

Uma linha de código geralmente não termina até que R encontre um parâmetro ou pontuação de parada apropriado que conclua algum código, como parêntese fechado fechado ), colchete ], colchete } ou aspas `.

Por exemplo, copie e cole este código em seu console

incompleto <- "Eu sou um objeto incompleto

Você verá em seu R como este código está incompleto. Faltou você fechar as aspas. Por isto, o promt to R estava com o símbolo +, esperando você finalizar a linha de código.

Abrindo um script

Você pode abrir um script novo clicando na aba File -> New File -> R Script. O seu editor de script funciona basicamente como um documento de texto qualquer. Na verdade você pode escrever seu código em um editor de texto (notepad), e copiar e colar para seu console, ou linha de comando do seu computador.

O RStudio integra este editor de script com outras ferramentas, incluindo o console. Por isto, o RStudio é considerado um ambiente de desenvolvimento integrado (IDE). Agora, abra um script, e copie e cole o código abaixo. Depois, rode usando command + enter (Mac) ou Ctrl + enter (PC).

2^2
## [1] 4
2*2
## [1] 4
2/2
## [1] 1

Programadores em geral não utilizam diretamente o console, seja em R, Python, Java, ou qualquer outro. Utilizar um script traz inúmeros vantagens: mais flexibilidade ao código, permite escrever códigos mais longos e complexos, fazer comentários no seu código, explicar suas decisões e permitir que outros entendem melhor seus códigos, salvar seus códigos e compartilhá-lhos são apenas algumas das vantagens de usar um editor de script.

Quando deve criar um script?

Organizar seus códigos, pastas e fluxo de trabalho em R é fundamental. Na próxima semana, discutiremos este tópico em detalhes!

Porém, vamos a nossa regra para criação de script. Eu recomendo que você tenha um script para cada tarefa distinta executada em R. Por exemplo, eu sugiro que vocês tenham um script para cada uma de nossas aulas.

Commentários

Uma hashtag # diz ao R que você não deseja que essa linha ou bloco de código seja executado - isso é chamado de comentando seu código. Isso é útil para você fazer anotações e pode até adicionar hashtags após linhas de código executável, na mesma linha.

Sempre anote seus códigos Ajude você no futuro!

Pacotes em R.

Um pacote em R é simplemente um conjunto de funções - e às vezes com dados - disponibilizados por outros usuários ou pela própria equipe de manutenção e criação do R. Estas funções em gerais são colocadas juntas em um pacote porque servem a um propósito específico, por exemplo, um modelo estatístico novo, um conjunto de funções para visualização de dados ou um pacote com funções para acessar dados eleitorais.

Instalar um pacote consiste, basicamente, em fazer download de uma pasta – onde estão salvas um conjunto de funções – para seu computador. Por isso, você instala o pacote somente uma vez.

No entanto, cada vez que você abre seu R, você precisa lembrá-lo de que você possui determinados pacotes instalados, e, ao invés de baixar tudo outra vez, você pode somente ativá-los. Esta é a diferença entre install.packages() e library()

Instalar Pacotes Via Cran.

O CRAN é o repositório oficial do R. Lá estão todos os pacotes que cumprem determinados requisitos da equipe do R, e, portanto, entram no repositório oficial.

install.packages("devtools", force=TRUE)

Ativar um pacote.

library(devtools)

Instalar Pacotes Via Github.

Nem todos os pacotes estão no CRAN. Há pacotes, e versões mais atualizadas de determinados pacotes, que estão disponíveis no Github – um repositório de códigos para programadores.

install_github("silvadenisson/electionsBR")

Funções de Ajuda.

Há duas formas principais de pedir ajuda em R.

Pedindo ajuda via R

Todas as funções e pacotes de R possuem uma documentação. Esta documentação explica como utilizar determinada função, quais seus argumentos, e provê exemplos de uso. Esta ajuda aparecerá em painel inferior direito. Você pede ajuda desta forma:

# Ajuda específica.
?mean  # Help para a função mean.
help(mean)

# Ajuda mais geral: busca todas as ocorrências do nome da função. 
??mean

Pedindo ajuda via Google.

Você deve usar o Google e o StackOverflow para solucionar erros em seus códigos. Aqui estão algumas dicas sobre como pesquisar erros no Google:

  • Google: nome do função/pacote + texto na mensagem de erro.

  • Remova as informações específicas do usuário e dos dados primeiro!

  • Veja se você consegue encontrar exemplos que produzem e não produzem o erro. Experimente o código de outras pessoas, mas

  • Tende entender a solução. Copiar e Colar não resolver seu problema.

A Regra dos 15 minutos

Retirado de Rochele Terman plsc-31101.

Objetos em R.

Cada linguagem de programação possui regras próprias sobre como criar, acessar e guardar variáveis no seu ambiente de trabalho.

Em R, variáveis, ou objetos, são criados atribuindo determinado dado a um determinado nome, e você pode acessá-los exatamente por nome atribuído.

Criando Objetos

Para criar um objeto usamos esta função de atribuição (assignment operator) <-.

# Variáveis Numéricas
x <- 5
y <- 7

# Variáveis de Texto.
nome <- "Tiago Ventura"

Acima, nós atribuímos os valores 5, 7, e “Tiago Ventura” aos objetos de nome x, y, e nome.

Esta é a lógica: object_name <- value

É possível criar variáveis utilizando =. Porém, o uso deste operador não é recomendado, visto que = também possui diversas outras funcionalidade em R. Por exemplo:

mean(x=c(5, 7))
## [1] 6

Pergunta: Qual o valor de x agora?

????

Objetos no ambiente de trabalho?

Todos os objetos de R estão salvos em nosso ambiente de trabalho e podemos acessá-los diretamente, usando o nome dos objetos.

# Verificar ambiente de trabalho
ls()
## [1] "nome" "x"    "y"
# Acessando os objetos
x
## [1] 5
y
## [1] 7
x+y
## [1] 12

Removendo Objetos.

# Para Remover
rm(x)

ls()
## [1] "nome" "y"

Visualizando objetos.

nome # ou 
## [1] "Tiago Ventura"
print(nome)
## [1] "Tiago Ventura"

Modificando objetos.

nome <- "Tiago Augusto Ventura"

Regras para nomes dos objetos.

Nomes de objetos podem conter apenas letras, números, "_" e “..”

Boas Práticas: crie nomes de forma efetiva, que descrevem de forma acurada os objetos do seu ambiente de trabalho.

Nosso objetivo enquanto acadêmicos é produzir ciência e pesquisa, e parte do processo de criar conhecimento consiste em compartilhar suas pesquisas, incluindo seus códigos. Portanto, crie nomes que qualquer outro acadêmico ao ler seu código entenderá a que este objeto se refere .

Alerta: Nomes em R são sensitivos a capitalização.

r_intro_css <- 10
r_Intro_css
## Error in eval(expr, envir, enclos): object 'r_Intro_css' not found
r_intro_css_
## Error in eval(expr, envir, enclos): object 'r_intro_css_' not found

Classes de Objetos

Cada objeto em R possui uma Classe. Em síntese, a classe descreve qual tipo de valores esse objeto está armazenando. De forma práticas, veremos objetos em R nas seguintes classes:

  • Character

  • Numeric

  • Interger

  • Logical

Exemplos:

ExemploTipo
a , swcCharacter
2, 3, 15Numeric
1, 2Interger
FALSE, TRUELogical

Classas são importante porque o R está programado para lidar com estes tipos de variáveis. Em resumo, o R entende que determinado tipo de objeto é numérico, e portanto, este objetivo pode realizar determinadas funções.

A função class() permite que você descubra a classe de um objeto.

class(3)
## [1] "numeric"
class(TRUE)
## [1] "logical"
meu_numero_da_sorte= "13"

class(meu_numero_da_sorte)
## [1] "character"
class(meu_numero_da_sorte==13)
## [1] "logical"

Um exemplo sobre como o R advinha as classes e usa-as para definir quais funções podem ser aplicadas a estes objetos:

25 - "13"
## Error in 25 - "13": non-numeric argument to binary operator

Esta substituição retorna um erro porque o objeto “13” não é numérico, e operações matemáticas exigem objetos numéricos.

is.class?

É possível, por exemplo, checar diretamente se objetos são de determinada class.

is.numeric(2)
## [1] TRUE
is.logical(TRUE)
## [1] TRUE
is.character("2")
## [1] TRUE
is.integer(1L)
## [1] TRUE

Coerção: Alterando Classes.

Classes de objetos em R também podem ser alteradas usando as funções as.class()

# Cria Objeto
num_1_5 <- c(1, 2, 3, 4, 5)

# Altera a classe
char_1_5 <- as.character(num_1_5)

# Checando
class(char_1_5)
## [1] "character"
class(num_1_5)
## [1] "numeric"
# Ou
as.numeric("25")
## [1] 25

Desafio 1.

Vamos praticar um pouco o que aprendemos até aqui. O que os comandos abaixo retornarão? Qual o resultado e porquê?

Questão 1:

install.packages(tidyverse) # Este código irá funcionar?

Questão 2:

false <- "FALSE"
false <- as.logical(false)
class(false)

Questão 3

x=10
mean(x = sample(1:50, 5)) == mean(x) # TRUE ou FALSE

Operadores Booleanos e Operadores Lógicos

Expressões booleanas são valores lógicos que retornam se determinada relação é verdadeira ou falsa.

Estão expressão booleanas são a base de diversas linguagens de programação, incluindo R. Usaremos expressões booleanas para filtrar vetores ou bancos de dados, escrever loops, funções, relações condicionais, ou simplesmente comparar dois números.

Quando você digita uma expressão booleana em R, R produzirá TRUE se a expressão for verdadeira e FALSE se a expressão for falsa. Os operadores booleanos são:

OperadorO_que_Faz
<menor que
<=menor ou igual que
>maior que
>=maior ou igual que
==exatamente igual
!=diferente
%in%é um objeto nesta lista

Operadores Lógicos

Por outro lado, operadores lógicos servem para combinar multiplas análises usando operadores booleanos. Operadores lógicos são:

tribble(~Operador, ~O_que_Faz, 
" x & y ",  " x E y", 
"x |  y "   , "x ou y",
"!x"    , "Oposto de x") %>%
   kbl() %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
OperadorO_que_Faz
x & yx E y
x | yx ou y
!xOposto de x

Alguns exemplos:

x <- 10

y <- 20

# Booleano Básico
x>y
## [1] FALSE
x==y
## [1] FALSE
x%in%y
## [1] FALSE
x<y
## [1] TRUE
# Operadores Lógicos

x>15 | y > 15
## [1] TRUE
x >15 & y > 15
## [1] FALSE

Porquê isso importa?

Operadores Booleanos não são inicialmente intuitivos, e mais importante, é difícil de entender sua utilidade quando você inicia a programar. Porém, um bom entendimento de operadores booleanos e lógicos formam uma sólida base da sua capacidade de programçaõ em R.

Uma das principais utilidades é usar operadores boleanos para filtrar variáveis. Esta lógica se aplica a estruturas de dados mais complexos, que veremos a seguir.

x <- sample(-50:50, 10)

# Quais números são positivos?
x>0
##  [1] FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE
# Posso selecionar eles?
x[x>0]
## [1] 22 36 29  9

Estrutura de Dados.

Um objeto pode ter diferente estruturas. Vamos vê-las rapidamente.

  • vector
  • matrix
  • data.frame
  • list
  • array

Vector

# vetor de números
X <- c(1, 2.3, 4, 5, 6.78, 6:10)
X
##  [1]  1.00  2.30  4.00  5.00  6.78  6.00  7.00  8.00  9.00 10.00
# Class
class(X)
## [1] "numeric"
# Tamanho 
length(X)
## [1] 10

Matrix

Estrutura de Dados Retangular (Linhas x Colunas). Extremamente útil para operações matemáticas, rápida manipulação.

Principal característica: comporta somente elementos numéricos

# Coerce to a matrix
as.matrix(X)
##        [,1]
##  [1,]  1.00
##  [2,]  2.30
##  [3,]  4.00
##  [4,]  5.00
##  [5,]  6.78
##  [6,]  6.00
##  [7,]  7.00
##  [8,]  8.00
##  [9,]  9.00
## [10,] 10.00
# Cria uma Matrix do zero
matrix(1:10, nrow=5, ncol=2)
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10

List

A lista é extremamente útil para aplicações mais avançadas. Funciona como um repositório de vários objetos. É como uma grande gaveta onde você pode salvar sua bagunça.

Principal Característica: Tudo cabe dentro de uma lista. Elementos podem ser de classes varidas.

# coerce to a list

as.list(X)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2.3
## 
## [[3]]
## [1] 4
## 
## [[4]]
## [1] 5
## 
## [[5]]
## [1] 6.78
## 
## [[6]]
## [1] 6
## 
## [[7]]
## [1] 7
## 
## [[8]]
## [1] 8
## 
## [[9]]
## [1] 9
## 
## [[10]]
## [1] 10
# or

lista_1 <- list(X, as.matrix(X), as.character(X))

# Visualize a lista.

str(list)
## function (...)

Data Frame.

Em português, banco de dados. É uma estrutura de dados retangular, porém, diferente da matrix, comporta colunas de classes diferentes. É como uma planilha de excel no seu ambiente R.

A existência de data frames como classes básicas do R é uma das característica que fizeram do R um software tão útil para ciência de dados, sobretudo, no que se refere a manipulação e limpeza de dados retangulares. O Python, por exemplo, não possui data frames em seus tipos de objetos básico.

Vamos abaixo focar um pouco na manipulação de bancos de dados, dado que está é um conhecimento importante para nossas aplicações práticas.

Criando um banco de dados.

# Coercing
as.data.frame(X)
##        X
## 1   1.00
## 2   2.30
## 3   4.00
## 4   5.00
## 5   6.78
## 6   6.00
## 7   7.00
## 8   8.00
## 9   9.00
## 10 10.00
# Criando Manualmente

data <- data.frame(name=c("Tiago", "Tiago"), last_name=c("Ventura", "Ventura") , school=c("UMD", "FGV"), age=c(30,32))

Além disso, o R possui diversos bancos de dados pre-armazenados na sua memória, ou em pacotes disponíveis para download. Para começar, vamos instalar e fazer o download do banco de dados sobre o show do netflix The Great British Bake Off. Neste link, você pode ver mais informações do pacote

Este pacote possui um conjunto de bancos de dados. Para ativar o banco de dados do pacote, precisamos somente usar a função data()

#devtools::install_github("apreshill/bakeoff")
library(bakeoff) # Chamando o pacote

# O que tenho no meu ambiente?
ls()
##  [1] "char_1_5"            "data"                "lista_1"            
##  [4] "meu_numero_da_sorte" "nome"                "num_1_5"            
##  [7] "r_intro_css"         "x"                   "X"                  
## [10] "y"
# ativa o banco de dados
data("bakers")
ls()
##  [1] "bakers"              "char_1_5"            "data"               
##  [4] "lista_1"             "meu_numero_da_sorte" "nome"               
##  [7] "num_1_5"             "r_intro_css"         "x"                  
## [10] "X"                   "y"
# Examine o objeto.
class(bakers)
## [1] "tbl_df"     "tbl"        "data.frame"
str(bakers)
## tibble[,8] [120 × 8] (S3: tbl_df/tbl/data.frame)
##  $ series     : Factor w/ 10 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ baker_full : chr [1:120] "Annetha Mills" "David Chambers" "Edward \"Edd\" Kimber" "Jasminder Randhawa" ...
##  $ baker      : chr [1:120] "Annetha" "David" "Edd" "Jasminder" ...
##  $ age        : num [1:120] 30 31 24 45 25 51 44 48 37 31 ...
##  $ occupation : chr [1:120] "Midwife" "Entrepreneur" "Debt collector for Yorkshire Bank" "Assistant Credit Control Manager" ...
##  $ hometown   : chr [1:120] "Essex" "Milton Keynes" "Bradford" "Birmingham" ...
##  $ baker_last : chr [1:120] "Mills" "Chambers" "Kimber" "Randhawa" ...
##  $ baker_first: chr [1:120] "Annetha" "David" "Edward" "Jasminder" ...

Acessando dados em um Data Frame

Pela Ordem da Coluna

bakers[,1] # primeira coluna
## # A tibble: 120 x 1
##    series
##    <fct> 
##  1 1     
##  2 1     
##  3 1     
##  4 1     
##  5 1     
##  6 1     
##  7 1     
##  8 1     
##  9 1     
## 10 1     
## # … with 110 more rows

Pela Nome da Coluna

bakers$age
##   [1] 30 31 24 45 25 51 44 48 37 31 31 31 40 63 19 41 31 45 25 31 40 43 63 27 45
##  [26] 21 22 27 36 43 38 28 26 50 25 31 66 51 31 37 51 30 38 37 54 20 30 35 31 69
##  [51] 39 31 32 41 42 17 60 66 38 37 53 19 41 66 37 30 49 49 35 29 32 25 23 31 61
##  [76] 37 67 46 20 28 30 26 66 50 71 46 21 29 19 52 33 42 34 29 46 30 33 36 33 47
## [101] 60 27 30 26 30 29 56 28 24 32 36 40 20 20 26 35 56 34 28 28
# Ou

bakers[,"age"]
## # A tibble: 120 x 1
##      age
##    <dbl>
##  1    30
##  2    31
##  3    24
##  4    45
##  5    25
##  6    51
##  7    44
##  8    48
##  9    37
## 10    31
## # … with 110 more rows

Pela posição da linha

bakers[1:5, ]
## # A tibble: 5 x 8
##   series baker_full   baker    age occupation    hometown baker_last baker_first
##   <fct>  <chr>        <chr>  <dbl> <chr>         <chr>    <chr>      <chr>      
## 1 1      "Annetha Mi… Annet…    30 Midwife       Essex    Mills      Annetha    
## 2 1      "David Cham… David     31 Entrepreneur  Milton … Chambers   David      
## 3 1      "Edward \"E… Edd       24 Debt collect… Bradford Kimber     Edward     
## 4 1      "Jasminder … Jasmi…    45 Assistant Cr… Birming… Randhawa   Jasminder  
## 5 1      "Jonathan S… Jonat…    25 Research Ana… St Alba… Shepherd   Jonathan

Por linha e coluna

bakers[1:5, "age"]
## # A tibble: 5 x 1
##     age
##   <dbl>
## 1    30
## 2    31
## 3    24
## 4    45
## 5    25
bakers[5:15, 3:5]
## # A tibble: 11 x 3
##    baker      age occupation                     
##    <chr>    <dbl> <chr>                          
##  1 Jonathan    25 Research Analyst               
##  2 Lea         51 Retired                        
##  3 Louise      44 Police Officer                 
##  4 Mark        48 Bus Driver                     
##  5 Miranda     37 Food buyer for Marks & Spencer 
##  6 Ruth        31 Retail manager/Housewife       
##  7 Ben         31 Graphic Designer               
##  8 Holly       31 Advertising executive          
##  9 Ian         40 Fundraiser for English Heritage
## 10 Janet       63 Teacher of Modern Languages    
## 11 Jason       19 Civil Engineering Student

Nota rápida sobre como acessar estruturas de dados.

Há duas formas mais gerais de se acessar valores dentro de determinadas estruturas de dados (vetores, matrizes, listas…). É possível acessar via índices (indexes) e chaves (keys).

Índices referem-se as posições de forma númerica. E as chaves são os textos, com nomes, de cada valor. Por exemplo, ao usarmos este commando bakers[1,1] acessamos a primeira linha e a primeira coluna. Por outro lado, bakers[1,"age"] ou bakers$age, acessamos usando a chave “age” que é o nome da coluna.

Cada estrutura de dados possui formas específicas de acessar seus valores. Matrizes e Vetores permitem somente indexação númerica. Listas permitem índices e chaves. Vamos aprender mais sobre isso no decorrer do curso.

Funções úteis para data frames

A classe data.frame possuí algumas funções pré-construídas bastante úteis. Alguns exemplos:

head(bakers) # Mostra primeiras cinco linhas
## # A tibble: 6 x 8
##   series baker_full   baker    age occupation   hometown  baker_last baker_first
##   <fct>  <chr>        <chr>  <dbl> <chr>        <chr>     <chr>      <chr>      
## 1 1      "Annetha Mi… Annet…    30 Midwife      Essex     Mills      Annetha    
## 2 1      "David Cham… David     31 Entrepreneur Milton K… Chambers   David      
## 3 1      "Edward \"E… Edd       24 Debt collec… Bradford  Kimber     Edward     
## 4 1      "Jasminder … Jasmi…    45 Assistant C… Birmingh… Randhawa   Jasminder  
## 5 1      "Jonathan S… Jonat…    25 Research An… St Albans Shepherd   Jonathan   
## 6 1      "Lea Harris" Lea       51 Retired      Midlothi… Harris     Lea
tail(bakers) # últimas cinco linhas
## # A tibble: 6 x 8
##   series baker_full   baker    age occupation   hometown  baker_last baker_first
##   <fct>  <chr>        <chr>  <dbl> <chr>        <chr>     <chr>      <chr>      
## 1 10     Michael Cha… Micha…    26 Theatre man… Stratfor… Chakraver… Michael    
## 2 10     Michelle Ev… Miche…    35 Print shop … Tenby, W… Evans-Fec… Michelle   
## 3 10     Phil Thorne  Phil      56 HGV driver   Rainham   Thorne     Phil       
## 4 10     Priya O'Shea Priya     34 Marketing c… Leicester O'Shea     Priya      
## 5 10     Rosie Brand… Rosie     28 Veterinary … Somerset  Brandreth… Rosie      
## 6 10     Steph Black… Steph     28 Shop assist… Chester   Blackwell  Steph
summary(bakers) # clase de cada coluna
##      series    baker_full           baker                age       
##  4      :13   Length:120         Length:120         Min.   :17.00  
##  10     :13   Class :character   Class :character   1st Qu.:28.75  
##  2      :12   Mode  :character   Mode  :character   Median :34.00  
##  3      :12                                         Mean   :37.39  
##  5      :12                                         3rd Qu.:45.00  
##  6      :12                                         Max.   :71.00  
##  (Other):46                                                        
##   occupation          hometown          baker_last        baker_first       
##  Length:120         Length:120         Length:120         Length:120        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
## 
dim(bakes) # dimensões de linha e coluna
## [1] 548   6
glimpse(bakers) # outro modo de ver seus dados. 
## Rows: 120
## Columns: 8
## $ series      <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2…
## $ baker_full  <chr> "Annetha Mills", "David Chambers", "Edward \"Edd\" Kimber"…
## $ baker       <chr> "Annetha", "David", "Edd", "Jasminder", "Jonathan", "Lea",…
## $ age         <dbl> 30, 31, 24, 45, 25, 51, 44, 48, 37, 31, 31, 31, 40, 63, 19…
## $ occupation  <chr> "Midwife", "Entrepreneur", "Debt collector for Yorkshire B…
## $ hometown    <chr> "Essex", "Milton Keynes", "Bradford", "Birmingham", "St Al…
## $ baker_last  <chr> "Mills", "Chambers", "Kimber", "Randhawa", "Shepherd", "Ha…
## $ baker_first <chr> "Annetha", "David", "Edward", "Jasminder", "Jonathan", "Le…

Operações Boolenas: back, back, back again.

Podemos filtrar bancos de dados com base em operações boleanas.

# Bakers com mais de 60 anos
bakers[bakers$age>60,]
## # A tibble: 10 x 8
##    series baker_full   baker    age occupation  hometown  baker_last baker_first
##    <fct>  <chr>        <chr>  <dbl> <chr>       <chr>     <chr>      <chr>      
##  1 2      "Janet Basu" Janet     63 Teacher of… Formby, … Basu       Janet      
##  2 3      "Brendan Ly… Brend…    63 Recruitmen… Sutton C… Lynch      Brendan    
##  3 4      "Christine … Chris…    66 Director o… Didcot, … Wallace    Christine  
##  4 5      "Diana Bear… Diana     69 Women's In… Alkingto… Beard      Diana      
##  5 5      "Norman Cal… Norman    66 Retired Na… Portknoc… Calder     Norman     
##  6 6      "Marie Camp… Marie     66 Retired     Auchtera… Campbell   Marie      
##  7 7      "Jane Beedl… Jane      61 Garden des… Beckenham Beedle     Jane       
##  8 7      "Lee Banfie… Lee       67 Pastor      Bolton    Banfield   Lee        
##  9 7      "Valerie \"… Val       66 Semi-retir… Yeovil    Stones     Valerie    
## 10 8      "Flo Atkins" Flo       71 Retired     Merseysi… Atkins     Flo
#Bakers de Londers
bakers[bakers$hometown=="London",]
## # A tibble: 8 x 8
##   series baker_full   baker    age occupation    hometown baker_last baker_first
##   <fct>  <chr>        <chr>  <dbl> <chr>         <chr>    <chr>      <chr>      
## 1 2      Robert Bill… Robert    25 Photographer  London   Billington Robert     
## 2 4      Kimberley W… Kimbe…    30 Psychologist  London   Wilson     Kimberley  
## 3 6      Mat Riley    Mat       37 Fire fighter  London   Riley      Mat        
## 4 7      Selasi Gbor… Selasi    30 Client servi… London   Gbormittah Selasi     
## 5 9      Antony Amou… Antony    30 Banker        London   Amourdoux  Antony     
## 6 9      Dan Beasley… Dan       36 Full-time pa… London   Beasley-H… Dan        
## 7 9      Manon Lagrè… Manon     26 Software pro… London   Lagrève    Manon      
## 8 9      Ruby Bhogal  Ruby      29 Project mana… London   Bhogal     Ruby

Meio confuso né? Sim. Concordo. Por isso, vamos usar um pacote chamado dplyr para manipulação de bancos de dados. Vamos chegar lá nas próximas aulas.

Exportando banco de dados.

Uma função importante do R consiste em exportar seus resultados, incluindo um novo banco de dados. Há diversas funções para fazer isso, a depender do formato do output que você deseja. Alguns exemplos:

  • write.table() for txt
  • write.csv() for csv
  • write.xlsx for xlsx
  • save() to export as a RData

E muitas outras!

Um exemplo com .csv

# make a fake data set

dfake <- data.frame(normal=rnorm(100, 0, 1), 
                    uniform=runif(100, 0, 1), 
                    pois=rpois(100, 10))

# write.function(data, name_to_be_saved)
write.csv(dfake, "dfake.csv")

Mas… Onde estão meus dados? E onde R está olhando?

Na próxima semana, vamos discutir como organizar seus dados em R e como ter um fluxo de trabalho organizado. No entanto, vamos aprender primeiro o básico sobre diretórios de trabalho no R – que eu não recomendo seja sua rotina – porém que nos ajuda a entender como o R funciona.

Definir seu diretório de trabalho é um passo que sempre causa muita dor de cabeça à iniciantes em R. É simples, porém, como somos treinados com o point-and-click do windows, no começo pode parecer difícil.

O R não sabe intuitivamente onde estão seus dados. Se os dados estiverem em uma pasta especial chamada “pesquisa super secreta”, temos que dizer ao R como chegar lá.

Podemos fazer isso de duas maneiras:

    1. Aprenda onde seus arquivos estão.
    1. Defina seu diretório de trabalho para essa pasta;

Toda vez que o R é inicializado, ele olha para o mesmo lugar (chamado de global path), a menos que seja solicitado a ir para outro lugar.

# Onde meu R está olhando?
getwd()
## [1] "/home/venturat/Dropbox/fgv_capes_print/website/fgv_intro_css_/content/Tutoriais"
# Onde eu quero que olhe?
setwd("/home/venturat/Downloads")

Importando dados.

Os dados mais comuns que iremos importar serão .csv Estes tipos de arquivo são básicamente um arquivo de excel mais simples. Caso este arquivo esteja em seu diretório de trabalho, importá-lo para R é simples:

# Checa diretorio
getwd()
## [1] "/home/venturat/Dropbox/fgv_capes_print/website/fgv_intro_css_/content/Tutoriais"
# Ve arquivos neste diretorio.
list.files()
##  [1] "cao.png"                        "data.jpeg"                     
##  [3] "deputados_alerj.csv"            "dfake.csv"                     
##  [5] "example_markdown.html"          "example_markdown.Rmd"          
##  [7] "figs"                           "mun_1985.csv"                  
##  [9] "rstudio.png"                    "styles.css"                    
## [11] "tutorial_api.html"              "tutorial_api.rmd"              
## [13] "tutorial_joins_cache"           "tutorial_joins.html"           
## [15] "tutorial_joins.rmd"             "tutorial_raspagem_cache"       
## [17] "tutorial_raspagem.html"         "tutorial_raspagem.rmd"         
## [19] "tutorial_visualizacao_cache"    "tutorial_visualizacao_files"   
## [21] "tutorial_visualizacao_II_cache" "tutorial_visualizacao_II_files"
## [23] "tutorial_visualizacao_II.html"  "tutorial_visualizacao_II.rmd"  
## [25] "tutorial_visualizacao.html"     "tutorial_visualizacao.rmd"     
## [27] "tutorial1_instalacao.html"      "tutorial1_instalacao.rmd"      
## [29] "tutorial2_rbasico_cache"        "tutorial2_rbasico_files"       
## [31] "tutorial2_rbasico.html"         "tutorial2_rbasico.rmd"         
## [33] "tutorial2_rbasico.rmd.lock~"    "tutorial3_rbasicoII.html"      
## [35] "tutorial3_rbasicoII.rmd"        "tutorial4_rmarkdown.html"      
## [37] "tutorial4_rmarkdown.rmd"        "tutorial5_rprojects.html"      
## [39] "tutorial5_rprojects.rmd"        "tutorial6_dplyr_cache"         
## [41] "tutorial6_dplyr_files"          "tutorial6_dplyr.html"          
## [43] "tutorial6_dplyr.rmd"            "tutorial7_tidydata.html"       
## [45] "tutorial7_tidydata.rmd"
# Importa os dados. 
dados <- read.csv("dfake.csv")

dados
##       X      normal     uniform pois
## 1     1  1.05839342 0.083907538    9
## 2     2  0.72568021 0.422676714    8
## 3     3 -0.02611961 0.960513331   12
## 4     4 -0.96014305 0.327119922   10
## 5     5  0.63756339 0.201721686    9
## 6     6 -0.28472444 0.937967959   11
## 7     7  0.96073160 0.656437221    5
## 8     8 -1.58847398 0.344172079   15
## 9     9 -0.43869715 0.491008148    8
## 10   10 -0.23832596 0.303767503    6
## 11   11 -1.05874443 0.040193108    8
## 12   12  0.06844130 0.406652383   18
## 13   13 -1.37598756 0.223522570   12
## 14   14 -0.65499908 0.508981349   10
## 15   15 -0.74205451 0.579689276    7
## 16   16  1.58401428 0.486986908    7
## 17   17  0.48016476 0.269492050    8
## 18   18 -0.48615112 0.211876932    9
## 19   19 -0.73779716 0.889837916   10
## 20   20 -0.02957682 0.126897496    8
## 21   21 -0.91514677 0.099062991   13
## 22   22  0.02059756 0.018231801   13
## 23   23 -1.02806419 0.961531074   13
## 24   24 -2.35275523 0.278478305    9
## 25   25 -0.03963388 0.926778834    6
## 26   26  0.21155378 0.785121141    8
## 27   27  0.77235860 0.872812555    7
## 28   28  1.06353446 0.883585070    8
## 29   29  1.46667086 0.570160669    4
## 30   30  1.60955191 0.923460112    8
## 31   31  0.53109550 0.882896548   10
## 32   32  0.88890801 0.765389902   10
## 33   33 -0.86010115 0.752865166   12
## 34   34 -0.46639940 0.845591280    8
## 35   35  1.02471721 0.686706473    9
## 36   36 -0.44034261 0.752772692   14
## 37   37  0.08744307 0.951882144   12
## 38   38  0.05945331 0.914729854   14
## 39   39  0.28747814 0.282164482    8
## 40   40 -1.39198792 0.352023190    9
## 41   41 -0.33663789 0.461884863    7
## 42   42 -1.90393245 0.731584809   11
## 43   43  0.13965932 0.024922722   10
## 44   44  1.27319335 0.054795202    8
## 45   45  0.73421789 0.367920491   14
## 46   46  0.55495294 0.103272372    5
## 47   47  0.48403171 0.505670601    7
## 48   48 -1.21641688 0.333808986    9
## 49   49 -0.78210193 0.141061922   14
## 50   50 -0.76965524 0.773063051    5
## 51   51 -0.32384330 0.015055847    9
## 52   52 -1.66228410 0.015217601   14
## 53   53  0.71017910 0.936234810   12
## 54   54 -1.19461387 0.212494839   12
## 55   55  0.85876846 0.218512829   10
## 56   56  1.26043359 0.816747219    8
## 57   57 -2.40011829 0.138287176    8
## 58   58 -0.82817272 0.623255290    8
## 59   59  0.13754639 0.473274995    6
## 60   60  0.49569422 0.270645487   10
## 61   61  0.31874543 0.929958987   12
## 62   62  0.85637157 0.883855921   12
## 63   63  0.95665500 0.477444114   11
## 64   64  0.02612439 0.519624064   12
## 65   65 -0.29376447 0.463479884    6
## 66   66 -1.15939449 0.474200962    9
## 67   67 -1.81413562 0.005159762    9
## 68   68 -1.78749571 0.393862783   12
## 69   69 -0.36447765 0.586772554    9
## 70   70 -0.11412513 0.740586771   11
## 71   71 -0.46454306 0.304490996   12
## 72   72 -0.61708660 0.033328769    8
## 73   73 -0.42140987 0.030072994   18
## 74   74  0.79299569 0.863866405   15
## 75   75 -0.85414669 0.490470741    8
## 76   76  1.26111795 0.834986040   12
## 77   77 -0.82277200 0.121290795   10
## 78   78  1.28564254 0.815818344    8
## 79   79  0.75784843 0.709173859   13
## 80   80  1.61386404 0.725295042    9
## 81   81  1.29614350 0.853127639    9
## 82   82  0.13608120 0.514760664    8
## 83   83  0.08491760 0.453090254   11
## 84   84 -0.45682619 0.181166531    9
## 85   85 -0.46604936 0.984378396   10
## 86   86  0.86816737 0.672659246   10
## 87   87  1.15981205 0.059031170    5
## 88   88  0.02675689 0.999804850   11
## 89   89 -0.87618598 0.838986212    4
## 90   90  0.52030054 0.751445759   11
## 91   91 -1.16961787 0.216527095   10
## 92   92 -2.13672540 0.101751544    7
## 93   93 -0.61376161 0.901545833   10
## 94   94  0.48706913 0.320436247   18
## 95   95 -2.14857762 0.202340078   18
## 96   96 -0.71191066 0.202320317   14
## 97   97  0.04049229 0.431886403   14
## 98   98  0.05124224 0.553126397   12
## 99   99  0.32673601 0.498391295   11
## 100 100 -0.66981951 0.514991716   13

Assim como para write, há diversas funções para importar dados em R. Exemplos:

  • read.table() mais flexível, funciona principalmente para txt.
  • read_excel() arquivos de excel (pacote readxl)
  • read_dta() arquivos de Stata (pacote haven).

Estes são somente alguns poucos exemplos. Há multiplas funcões, algumas para abrir o mesmo tipo de arquivo, disponíveis para baixar.

Por exemplo, vamos usar mais a função read_csv, ao invés do read.csv, do pacote readr, porque esta função é mais eficiente quando lidamos com conjunto grande de dados.

Desafio 2

Acima, quando filtramos o banco de dados bakers, usamos a seguinte função:

bakers[bakers$age>60,]

Me explique com o máximo de detalhes o que está linha de código está fazendo. Porque a operação booleana está antes da virgula? Qual o output da operação booleana?