class: center, middle, inverse, title-slide # Introdução a Métodos Computacionais para Ciência Sociais ### Tiago Ventura ### CPDOC-FGV --- class: center, middle # Introdução ao R: Parte I --- # Logística: Exercícios. -- 1 - Exercícios todas as semanas (até a semana 8) -- 2 - Entrega via Slack. -- 3 - Regras para entrega atrasada: perde um ponto por dia de atraso. -- 4 -40% da Nota Final vem destes exercícios. -- --- # Logística II: Como acompanhar as aulas de programação? -- 1. Leia os tutoriais. -- 2. Abra o RStudio e pratique com os códigos dos tutoriais. -- 3. Pratique com as leituras indicadas e exercícios. -- --- # Tópicos de Hoje 1. Workflow: RStudio e Scripts. 2. Como Interagir com R. 3. Pacotes em R. 4. Ajuda em R. 5. Objetos e Classes 6. Operadores Booleanos 7. Estrutura de Dados 8. Manipulação Básica de Dados. 9. Exportar e Importar Bancos de Dados. --- # O que é o R? Ou porquê o R? * Software de código aberto. * Superior (se não apenas comparável) às alternativas comerciais. * 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. * Não apenas para estatística, mas também **programação de uso geral**. --- # 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. <img src="figs/R_vs_RStudio_1.png" width="100%" /> .footnote[Fonte para figura: [Rochele Terman's Intro to CSS Book](https://plsc-31101.github.io/course/r-basics.html)] --- # Navegando no R Studio <img src="figs/rstudio.png" width="100%" /> --- class: center, middle, inverse # Como Interagir com R --- # R Via Console (Tela Inferior Esquerda) o prompt `>` aparece um símbolo maior que. Copie e cole o código abaixo em seu Console e click Enter. ```r 2+2 ``` ``` ## [1] 4 ``` R usa `+` quando o código é dividido em várias linhas e R ainda espera mais código. ```r # Este Código Retornará um + incompleto <- "Eu sou um objeto incompleto ``` 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 `` ` --- # R Via Script (Tela Superior Esquerda) Abrir um script novo clicando na aba `File` -> `New File` -> `R Script` O Script envia código diretamente para o console. -- #### `command + enter` (Mac) ou `Ctrl + enter` (PC) com o cursor na linha para rodar o script. -- ```r # Rode estas operação em um script. # Hashtags permite você comentar seu código. 2^2 2*2 2/2 ``` --- class: center, middle, inverse # Pacotes --- # O que são pacotes? -- - Um conjunto de funções organizadas em torno de um tema. -- - As vezes provêm dados. -- - Uma pasta em seu computador. -- - Um sinal de bondade de outros programadores. -- - São instalados apenas uma vez: `install.packages()` -- - Ativados em toda sessão de R: `library()` --- class: center, middle ## Instalar Pacotes Via Cran. ```r install.packages("devtools", force=TRUE) ``` ## Ativar um pacote. ```r library(devtools) ``` ## Instalar Pacotes Via Github. ```r install_github("silvadenisson/electionsBR") ``` --- class: center, middle, inverse # Funções de Ajuda. --- ## Pedindo ajuda via R ```r # 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 ``` .center[ <img src="figs/ajuda.png" width="70%" /> ] --- ## Pedindo ajuda via 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 tente entendê-los. Não copie e cole. - Tende entender a solução. Copiar e Colar não resolver seu problema. --- class: center, middle ## A Regra dos 15 minutos Retirado de [Rochele Terman plsc-31101](https://plsc-31101.github.io/course/introduction.html). <img src="slides-02-intro_files/figure-html/unnamed-chunk-11-1.png" width="50%" /> --- class: center, middle, inverse # Objetos em R. --- # O que são objetos ? Peça base do R. Objetos são criados atribuindo determinado **dado** a um determinado **nome**, e você pode acessá-los exatamente por nome atribuído. `Tudo que existe no R é um objeto.` --- ## Criando Objetos *(assignment operator)* `<-` ```r # Variáveis Numéricas x <- 5 y <- 7 # Variáveis de Texto. nome <- "Tiago Ventura" ``` --- ## Posso usar o `=` para criar objetos? -- Sim. Mas... -- .center[ ![](https://media.giphy.com/media/JYZ397GsFrFtu/giphy.gif) ] -- ### Qual o valor de x agora? ```r mean(x=c(5, 7)) ``` --- class: center, middle ## Outros Comandos Importantes #### Verificar Ambiente de Trabalho ```r ls() ``` ``` ## [1] "nome" "x" "y" ``` #### Remover Objetos ```r rm(y) ``` #### Visualizando objetos. ```r print(nome) ``` ``` ## [1] "Tiago Ventura" ``` #### Modificando objetos. ```r nome <- "Tiago Augusto Ventura" ``` --- class: middle, center, inverse # Classes de Objetos --- ## Classes em R Casa objeto em R possui uma **Classe**. Em síntese, a classe descreve qual tipo de valores esse objeto está armazenando. Principais classes: - Character - Numeric - Interger - Logical --- ## Resumo <table class="table table-striped table-hover table-condensed" style="margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Example </th> <th style="text-align:left;"> Tipo </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> a , swc </td> <td style="text-align:left;"> Character </td> </tr> <tr> <td style="text-align:left;"> 2, 3, 15 </td> <td style="text-align:left;"> Numeric </td> </tr> <tr> <td style="text-align:left;"> 1, 2 </td> <td style="text-align:left;"> Interger </td> </tr> <tr> <td style="text-align:left;"> FALSE, TRUE </td> <td style="text-align:left;"> Logical </td> </tr> </tbody> </table> --- ## Descobrindo as Classes dos meus objetos. `class()` ```r class(3) ``` ``` ## [1] "numeric" ``` ```r class(TRUE) ``` ``` ## [1] "logical" ``` ```r meu_numero_da_sorte= "13" class(meu_numero_da_sorte) ``` ``` ## [1] "character" ``` ```r class(meu_numero_da_sorte==13) ``` ``` ## [1] "logical" ``` --- ## Outra forma: is.class? ```r is.numeric(2) ``` ``` ## [1] TRUE ``` ```r is.logical(TRUE) ``` ``` ## [1] TRUE ``` ```r is.character("2") ``` ``` ## [1] TRUE ``` ```r 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()` ```r # 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" ``` ```r class(num_1_5) ``` ``` ## [1] "numeric" ``` ```r # 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: ```r install.packages(tidyverse) ``` #### Questão 2: ```r false <- "FALSE" false <- as.logical(false) class(false) ``` #### Questão 3 ```r mean(x = sample(1:50, 5)) == mean(x) # TRUE ou FALSE ``` ```{=html} <div class="countdown" id="timer_611c3e06" style="top:0;right:0;margin:5%;padding:10px;font-size:3em;" data-warnwhen="0"> <code class="countdown-time"><span class="countdown-digits minutes">05</span><span class="countdown-digits colon">:</span><span class="countdown-digits seconds">00</span></code> </div> ``` --- class: center, middle, inverse # Intervalo ```{=html} <div class="countdown" id="timer_611c3f29" style="right:25%;bottom:15%;margin:5%;font-size:5em;" data-warnwhen="0"> <code class="countdown-time"><span class="countdown-digits minutes">10</span><span class="countdown-digits colon">:</span><span class="countdown-digits seconds">00</span></code> </div> ``` --- class: middle, center, inverse # Estrutura de Dados --- ## Vector ```r # 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 ``` ```r # Class class(X) ``` ``` ## [1] "numeric" ``` ```r # Tamanho length(X) ``` ``` ## [1] 10 ``` --- ## Matrix **Principal característica:** Retangular e Números. ```r # 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 ``` ```r # 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 **Principal Característica**: Tudo cabe dentro de uma lista e Iterável. ```r # 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 ``` ```r # or lista_1 <- list(X, as.matrix(X), as.character(X)) # Visualize a lista. str(list) ``` ``` ## function (...) ``` --- # Data Frame. 1. Banco de dados. 2. Dados retangular. 3. Comporta colunas de classes diferentes. 4. É um planilha de excel no seu ambiente R. 5. Class básica do R, diferente de outras linguagens. --- ## Criando um banco de dados. ```r # 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 ``` ```r # Criando Manualmente data <- data.frame(name=c("Tiago", "Tiago"), last_name=c("Ventura", "Ventura") , school=c("UMD", "FGV"), age=c(30,32)) data ``` ``` ## name last_name school age ## 1 Tiago Ventura UMD 30 ## 2 Tiago Ventura FGV 32 ``` --- ## Bancos de Dados Pré-Construídos. ```r #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] "x" "X" ``` ```r # 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" "x" "X" ``` ```r # Examine o objeto. class(bakers) ``` ``` ## [1] "tbl_df" "tbl" "data.frame" ``` ```r 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** ```r 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** ```r 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 ``` ```r # 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** ```r 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** ```r bakers[1:5, "age"] ``` ``` ## # A tibble: 5 x 1 ## age ## <dbl> ## 1 30 ## 2 31 ## 3 24 ## 4 45 ## 5 25 ``` ```r 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 ``` --- ### Outras Funções Úteis A classe data.frame possuí algumas funções pré-construídas bastante úteis. Alguns exemplos: ```r head(bakers) # Mostra primeiras cinco linhas tail(bakers) # últimas cinco linhas summary(bakers) # clase de cada coluna dim(bakes) # dimensões de linha e coluna glimpse(bakers) # outro modo de ver seus dados. ``` --- ### Operações Boolenas back, back, back again. ```r # 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 ``` ```r #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 ``` --- ## 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 --- # Exportando como csv. ```r # 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? 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. -- 2. Defina seu **diretório de trabalho** para essa pasta: todos seus outputs e inputs estarão lá. -- --- ## Paths 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. ```r # Onde meu R está olhando? getwd() ``` ``` ## [1] "/home/venturat/Dropbox/fgv_capes_print/website/fgv_intro_css_/static/slides" ``` ```r # Onde eu quero que olhe? setwd("/home/venturat/Downloads") ``` --- ## Importando dados. ```r # Checa diretorio getwd() ``` ``` ## [1] "/home/venturat/Dropbox/fgv_capes_print/website/fgv_intro_css_/static/slides" ``` ```r # Ve arquivos neste diretorio. list.files() ``` ``` ## [1] "aulas-estatistica.png" "cao.png" ## [3] "code" "deputados_alerj.csv" ## [5] "dfake.csv" "figs" ## [7] "fontsrladies.css" "libs" ## [9] "mun_1985.csv" "rdd.png" ## [11] "slides_apis_cache" "slides_apis_files" ## [13] "slides_apis.html" "slides_apis.Rmd" ## [15] "slides_aula_textos_tutorial_cache" "slides_aula_textos_tutorial.html" ## [17] "slides_aula_textos_tutorial.Rmd" "slides_experimentos_cache" ## [19] "slides_experimentos_files" "slides_experimentos_ufmg.html" ## [21] "slides_experimentos_ufmg.pdf" "slides_experimentos_ufmg.Rmd" ## [23] "slides_experimentos.html" "slides_experimentos.Rmd" ## [25] "slides-01-cont.html" "slides-01-cont.Rmd" ## [27] "slides-01-intro_files" "slides-01-intro.html" ## [29] "slides-01-intro.Rmd" "slides-02-intro_files" ## [31] "slides-02-intro_II_files" "slides-02-intro_II.html" ## [33] "slides-02-intro_II.Rmd" "slides-02-intro.html" ## [35] "slides-02-intro.Rmd" "slides-03-r_markdown.html" ## [37] "slides-03-r_markdown.Rmd" "slides-04-intro-tidyverse_cache" ## [39] "slides-04-intro-tidyverse_files" "slides-04-intro-tidyverse.html" ## [41] "slides-04-intro-tidyverse.Rmd" "slides-05-joins_cache" ## [43] "slides-05-joins.html" "slides-05-joins.Rmd" ## [45] "slides-06-tidy_cache" "slides-06-tidy.html" ## [47] "slides-06-tidy.Rmd" "slides-raspagem_cache" ## [49] "slides-raspagem.html" "slides-raspagem.Rmd" ## [51] "slides-speed_dating.html" "slides-speed_dating.Rmd" ## [53] "slides-tidyverse-extra_cache" "slides-tidyverse-extra.html" ## [55] "slides-tidyverse-extra.Rmd" "slides-visualizacao_I_cache" ## [57] "slides-visualizacao_I_files" "slides-visualizacao_I.html" ## [59] "slides-visualizacao_I.Rmd" "slides-visualizacao_II_cache" ## [61] "slides-visualizacao_II_files" "slides-visualizacao_II.html" ## [63] "slides-visualizacao_II.Rmd" "styles.css" ## [65] "xaringan-themer_modify.css" "xaringan-themer.css" ``` ```r # Importa os dados. dados <- read.csv("dfake.csv") head(dados) ``` ``` ## X normal uniform pois ## 1 1 1.1088054 0.1173935 9 ## 2 2 0.2844622 0.8508718 13 ## 3 3 -0.1293795 0.5034212 9 ## 4 4 -0.1754044 0.8740060 14 ## 5 5 -0.8794987 0.1786838 6 ## 6 6 -0.1884141 0.1868031 11 ``` --- # Desafio 2 Acima, quando filtramos o banco de dados bakers, usamos a seguinte função: ```r bakers[bakers$age>60,] ``` Me explique com o máximo de detalhes o que a linha de código acima está fazendo. Porque a operação booleana está antes da virgula? Qual o output da operação booleana? ```{=html} <div class="countdown" id="timer_611c3ffa" style="right:0;bottom:0;margin:5%;padding:10px;font-size:3em;" data-warnwhen="0"> <code class="countdown-time"><span class="countdown-digits minutes">05</span><span class="countdown-digits colon">:</span><span class="countdown-digits seconds">00</span></code> </div> ``` --- # Nosso plano na próxima aula - Funções. - Iteração via Loops. - Controle de Fluxo. ## E não esqueção de olhar os tutoriais no site! ---