class: center, middle, inverse, title-slide # Minicurso R ### Lucas L. Oliveira
Diretor de Projetos Constat Jr
### Junho/2020 --- # O que é o R? - O R é uma linguagem de programação, além de um ambiente de software gratuito; - Oferece um vasto leque de funcionalidades acessíveis via instalação de bibliotecas; - O R possui uma comunidade extremamente ativa, engajada desde o aprimoramento da ferramenta e desenvolvimento de novas bibliotecas, até o suporte aos usuários. --- # RStudio - Optar por programar em R também implica na escolha de uma IDE (Integrated Development Environment) que, na grande maioria dos casos, será o RStudio. - O RStudio é um conjunto de ferramentas integradas projetadas (IDE - Integrated Development Environment) da linguagem R para editar e executar os códigos em R. - O R, em combinação com o RStudio, possui um conjunto de funcionalidades cuja intenção é ajudar no processo de desenvolvimento. **Sabendo disso, vamos falar um pouco sobre o layout desse IDE:** * Editor/Scripts: É onde escrever os códigos. Arquivos do tipo .R. * Console: Executar os comandos e ver os resultados. * Enviroment: Painel com todos os objetos criados. * History: História dos comandos executados. * Files: Navegar em pastas e arquivos. * Plots: Onde os gráficos serão apresentados. --- * Packages: Pacotes instalados (sem ticar) e habilitados (ticados). * Help: Retorna o tutorial de ajuda do comando solicitado com help() ou ?comando. Veremos melhor como pedir ajuda no R ainda nessa aula. --- # Como criar e salvar seus projetos - Organizar arquivos é uma parte integral do processo de programação. - Denominados “projetos”, eles não passam de pastas comuns com um arquivo .Rproj. Uma funcionalidade importante é a criação de projetos, permitindo dividir o trabalho em múltiplos ambientes, cada um com o seu diretório, documentos e workspace. Para criar um projeto, os seguintes passos podem ser seguidos: 1) Clique na opção “File” do menu, e então em “New Project”. 2) Clique em “New Directory”. 3) Clique em “New Project”. 4) Escreva o nome do diretório (pasta) onde deseja manter seu projeto, ex “my_project”. 5) Clique no botão “Create Project”. Para criar um novo script para escrever os códigos, vá em File -> New File -> R Script --- # Boas práticas para fazer um código bom e de fácil entendimento - Comente bem o seu código: É possível fazer comentários usando o símbolo ‘#’. É sempre bom explicar o que uma variável armazena, o que uma função faz, porque alguns parâmetros são passados para uma determinada função, qual é o objetivo de um trecho de código, etc. - Evite linhas de código muito longas: Usar linhas de código mais curtas ajuda na leitura do código. - Escreva um código organizado: Por exemplo, adote um padrão no uso de minúsculas e maiúsculas, uma lógica única na organização de pastas e arquivos, pode ser adotada uma breve descrição (como comentário) indicando o que um determinado script faz. - Carregue todos os pacotes que irá usar sempre no início do arquivo: Quando alguém abrir o seu código será fácil identificar quais são os pacotes que devem ser instalados e quais dependências podem existir. --- # Calculadora ```r #Soma 20+4 ``` ``` ## [1] 24 ``` ```r #Subtração 10-4 ``` ``` ## [1] 6 ``` ```r #Divisão 24/6 ``` ``` ## [1] 4 ``` ```r #Multiplicação 4*6 ``` ``` ## [1] 24 ``` --- ```r #Raiz quadrada sqrt(4) ``` ``` ## [1] 2 ``` ```r #Potência 2^2 ``` ``` ## [1] 4 ``` --- # Atribuição Para atribuir a um objeto no R, utilizamos <- ou =. Vejamos alguns exemplos: ```r x <- 50/5 x ``` ``` ## [1] 10 ``` ```r X ``` ``` ## Error in eval(expr, envir, enclos): objeto 'X' não encontrado ``` Acima vemos que o objeto X não foi encontrado, pois o R é case sensitive. Por isso, ele diferencia letras maiúsculas de minúsculas. --- # Objetos em R Aqui iremos abordar as cinco classes básicas que existe no R. São elas: * character: "Constat!" * numeric: 0.11 (números reais) * integer: 128288 (inteiros) * complex: 1 + 4i (números complexos, a + bi) * logical: TRUE (booleanos, TRUE/FALSE) Vamos atribuir a x a string constatjr: ```r x <- constatjr ``` ``` ## Error in eval(expr, envir, enclos): objeto 'constatjr' não encontrado ``` ```r x <- "constatjr" x ``` ``` ## [1] "constatjr" ``` --- No primeiro caso, quando atribuimos constatjr ao objeto x (x <- constatjr), irá existir um erro, pois o R entende que estamos tentando atribuir a x um outro objeto constatjr que ainda não foi declarado no código. Para que possamos atribuir uma string a um objeto, ela precisa estar entre aspas (x <- "constatjr"), já que uma string sem aspas é compreendida como um objeto. ```r constatjr <- 14 x <- constatjr x ``` ``` ## [1] 14 ``` Para sabermos qual a classe dos objetos que existem em nosso código, podemos utilizar a função class(). ```r w <- "constatjr" class(w) ``` ``` ## [1] "character" ``` ```r constatjr <- 10 class(constatjr) ``` ``` ## [1] "numeric" ``` --- E também podemos remover os objetos criados da seguinte maneira: ```r x <- 16 x ``` ``` ## [1] 16 ``` ```r remove(x) x ``` ``` ## Error in eval(expr, envir, enclos): objeto 'x' não encontrado ``` E se eu quiser limpar o console - apaga todos os objetos atribuidos até aqui: ```r rm(list=ls()) ``` --- # Data Structures * atomic vector * matrix * data frame --- ## Vector Podemos criar vetores de diferentes maneiras, dentre elas: ```r #Concatenando valores x <- c(1,2,3,4,5,6) x ``` ``` ## [1] 1 2 3 4 5 6 ``` ```r #Utilizando a fução rep(). y <- rep(2,6) y ``` ``` ## [1] 2 2 2 2 2 2 ``` ```r #Utilizando a função seq(). w <- seq(1,10) w ``` ``` ## [1] 1 2 3 4 5 6 7 8 9 10 ``` --- ```r a <- seq(1,10,3) a ``` ``` ## [1] 1 4 7 10 ``` ```r #Utilizando os ":" para definir um intervalo z <- 1:10 z ``` ``` ## [1] 1 2 3 4 5 6 7 8 9 10 ``` ```r #Concatenando strings cores <- c("azul", "verde", "roxo", "rosa") cores ``` ``` ## [1] "azul" "verde" "roxo" "rosa" ``` E se eu quiser visualizar apenas a posição 3 do vetor cores? ```r cores[3] ``` ``` ## [1] "roxo" ``` --- Operações vetoriais ```r j <- x*3 k <- c(x,j) k ``` ``` ## [1] 1 2 3 4 5 6 3 6 9 12 15 18 ``` Como calcularia o IMC de 6 pessoas? ```r peso <- c(62, 70, 52, 98, 90, 70) altura <- c(1.70, 1.82, 1.75, 1.94, 1.84, 1.61) imc <- peso/(altura^2) imc ``` ``` ## [1] 21.45329 21.13271 16.97959 26.03890 26.58318 27.00513 ``` --- #Matrizes ```r x <- matrix(seq(1,16), nrow=4,ncol=4) x ``` ``` ## [,1] [,2] [,3] [,4] ## [1,] 1 5 9 13 ## [2,] 2 6 10 14 ## [3,] 3 7 11 15 ## [4,] 4 8 12 16 ``` ```r x[2,3] #retorna o elemento na segunda linha e terceira coluna da matriz ``` ``` ## [1] 10 ``` ```r x[3, ] # seleciona a 3ª linha ``` ``` ## [1] 3 7 11 15 ``` ```r x[ , 2] # seleciona a 2ª coluna ``` ``` ## [1] 5 6 7 8 ``` --- ```r x[1,] <- c(13,15,19,30) #substituir a primeira linha por (13,15,19,30) x ``` ``` ## [,1] [,2] [,3] [,4] ## [1,] 13 15 19 30 ## [2,] 2 6 10 14 ## [3,] 3 7 11 15 ## [4,] 4 8 12 16 ``` Para sabermos a dimensão da matriz x, utilizamos a função dim(). ```r dim(x) ``` ``` ## [1] 4 4 ``` --- Concatenar linhas em uma matriz ```r vet <- c(2,20,12,34) x2 <- rbind(x,vet) x2 ``` ``` ## [,1] [,2] [,3] [,4] ## 13 15 19 30 ## 2 6 10 14 ## 3 7 11 15 ## 4 8 12 16 ## vet 2 20 12 34 ``` Concatenar colunas em uma matriz ```r v2 <- c(25,10,15,4) x3 <- cbind(x,v2) x3 ``` ``` ## v2 ## [1,] 13 15 19 30 25 ## [2,] 2 6 10 14 10 ## [3,] 3 7 11 15 15 ## [4,] 4 8 12 16 4 ``` --- Operações matriciais ```r xa <- x2[1:2,1:2] xa ``` ``` ## [,1] [,2] ## 13 15 ## 2 6 ``` ```r xb <- matrix(rnorm(4),2,2) xa*xb #multiplicacao ponto a ponto ``` ``` ## [,1] [,2] ## -10.5366076 -2.310055 ## 0.3228624 -8.477164 ``` ```r xa%*%xb #multiplicacao matricial ``` ``` ## [,1] [,2] ## -8.1151394 -23.194958 ## -0.6524293 -8.785171 ``` --- ```r solve(xa) #inversa de xa ``` ``` ## ## [1,] 0.12500000 -0.3125000 ## [2,] -0.04166667 0.2708333 ``` ```r diag(xa) #matriz diagonal ``` ``` ## [1] 13 6 ``` --- # Data frame Trata-se de uma “tabela de dados” onde as colunas são as variáveis e as linhas são os registros. Essas colunas podem ser de classes diferentes. Essa é a grande diferença entre data.frame’s e matrizes (matriz é só numerica). Posso criar um data frame no R com os vetores, por exemplo: ```r ID <- seq(1,6) pes <- c(62, 70, 52, 98, 90, 70) alt <- c(1.70, 1.82, 1.75, 1.94, 1.84, 1.61) imc <- pes/(alt^2) dados <- data.frame(ID=ID,peso=pes,altura=alt, imc=imc) dados ``` ``` ## ID peso altura imc ## 1 1 62 1.70 21.45329 ## 2 2 70 1.82 21.13271 ## 3 3 52 1.75 16.97959 ## 4 4 98 1.94 26.03890 ## 5 5 90 1.84 26.58318 ## 6 6 70 1.61 27.00513 ``` --- Selecionar a variavel de interesse: ```r dados$altura ``` ``` ## [1] 1.70 1.82 1.75 1.94 1.84 1.61 ``` Caso queira adicionar uma nova coluna ao data.frame não tem necessidade de fazer tudo novamente. Você pode fazer apenas isso: ```r gr <- c(rep(1,3),rep(2,3)) dados$grupo <- gr dados ``` ``` ## ID peso altura imc grupo ## 1 1 62 1.70 21.45329 1 ## 2 2 70 1.82 21.13271 1 ## 3 3 52 1.75 16.97959 1 ## 4 4 98 1.94 26.03890 2 ## 5 5 90 1.84 26.58318 2 ## 6 6 70 1.61 27.00513 2 ``` --- Funções úteis para data.frame: * head() - Mostra as primeiras 6 linhas. * tail() - Mostra as últimas 6 linhas. * dim() - Número de linhas e de colunas. * names() - Os nomes das colunas (variáveis). * str() - Estrutura do data.frame. Mostra, entre outras coisas, as classes de cada coluna. ```r names(dados) ``` ``` ## [1] "ID" "peso" "altura" "imc" "grupo" ``` ```r str(dados) ``` ``` ## 'data.frame': 6 obs. of 5 variables: ## $ ID : int 1 2 3 4 5 6 ## $ peso : num 62 70 52 98 90 70 ## $ altura: num 1.7 1.82 1.75 1.94 1.84 1.61 ## $ imc : num 21.5 21.1 17 26 26.6 ... ## $ grupo : num 1 1 1 2 2 2 ``` --- class: middle ```r mean(dados$imc) ``` ``` ## [1] 23.1988 ``` ```r sd(dados$imc) ``` ``` ## [1] 4.00006 ``` ```r summary(dados$imc) ``` ``` ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 16.98 21.21 23.75 23.20 26.45 27.01 ``` ```r table(dados$grupo) ``` ``` ## ## 1 2 ## 3 3 ``` --- # Arrays ```r dim3 <- array(rnorm(12),dim = c(2,2,3)) dim3 ``` ``` ## , , 1 ## ## [,1] [,2] ## [1,] 0.4158557 -0.8418662 ## [2,] 0.3517378 -0.7008945 ## ## , , 2 ## ## [,1] [,2] ## [1,] 1.930357 -0.2129792 ## [2,] -1.362148 -0.4132276 ## ## , , 3 ## ## [,1] [,2] ## [1,] -0.1426178 -1.550698 ## [2,] 0.9892819 1.030088 ``` --- # Operadores relacionais Igual a: == ```r 1==10 ``` ``` ## [1] FALSE ``` Diferente de: != ```r 1!=10 ``` ``` ## [1] TRUE ``` * Maior que: > * Maior ou igual: >= * Menor que: < * Menor ou igual: <= --- #Operadores lógicos * E: & - será verdadeiro se os dois forem TRUE ```r x <- 15 x > 10 & x < 30 ``` ``` ## [1] TRUE ``` ```r x < 10 & x < 30 ``` ``` ## [1] FALSE ``` * OU: | - será verdadeiro se um dos dois for TRUE ```r x > 10 | x > 30 ``` ``` ## [1] TRUE ``` --- * Negação: ! ```r x <- 15 !x<30 ``` ``` ## [1] FALSE ``` ```r !x>30 ``` ``` ## [1] TRUE ``` --- ### If e else ```r a <- 224 b <- 225 if (a==b) { v=10 } else {v=15} v ``` ``` ## [1] 15 ``` ```r a <- 224 b <- 225 if (a==b) { v=10 } else if (a > b) {v=15 } else {v=25} v ``` ``` ## [1] 25 ``` --- ### For ```r m <- c(1,20,50,60,100) ``` Quero criar um novo vetor p que seja formado por cada elemento de m dividido por sua posição. ```r p <- rep(0,length(m)) for (i in 1: length(m)){ p[i] <- m[i]/i } p ``` ``` ## [1] 1.00000 10.00000 16.66667 15.00000 20.00000 ``` --- # Funções ```r f.soma <- function(x,y) { out <- x+y return(out) } ``` * o nome: f.soma; * os argumentos: x e y; * o corpo out <- x+y e * o que retorna return(out). --- Vamos agora chamar a função: ```r f.soma(x=10,y=20) ``` ``` ## [1] 30 ``` ```r f.soma(10,20) ``` ``` ## [1] 30 ``` --- # Dados faltantes, infinitos e indefinições matemáticas * NA (Not Available): dado faltante/indisponível. * NaN (Not a Number): indefinições matemáticas. Como 0/0 e log(-1). * Inf (Infinito): número muito grande ou o limite matemático. Aceita sinal negativo -Inf. --- # Como obter ajuda no R * Help/documentação do R ```r help(mean) #ou ?mean ``` * Google --- # Pacotes ### Instalação * Via CRAN: install.packages("nome-do-pacote"). install.packages("tidyverse") Note que o nome do pacote está entre aspas. * Via Github: devtools::install_github("nome-do-repo/nome-do-pacote"). devtools::install_github("tidyverse/dplyr") ### Carregar pacotes: library(nome-do-pacote) Para carregar o pacote, não usar aspas. Só é necessário instalar o pacote uma vez, mas precisa carregá-lo toda vez que começar uma nova sessão. --- # Importação de dados ### Extensão .csv Opção com o pacote **readr**. ```r library(readr) #pacote readr dados_csv <- read_csv(file = "dados1.csv") ``` Vale ressaltar que para cada função read_, existe uma respectiva função write_ para salvar o arquivo no formato de interesse. Como exemplo, queremos salvar a base de dados cars. ```r write_csv(x = mtcars, path = "cars.csv") write_delim(x = mtcars, delim = " ", path = "cars.txt")) ``` --- ### Arquivos em Excel O pacote **readxl** pode ser utilizado para leiturade arquivos do Excel, como .xls e xlsx. ```r library(readxl) dados_excel <- read_xls(path = "dados1.xls") #Leitura do arquivo .xls dados_excelx <- read_xlsx(path = "dados1.xlsx") #Leitura do arquivo .xlsx ``` Uma maneira mais simples é a utilização da função read_excel(), pois ela auto detecta a extensão do arquivo. ```r library(readxl) dados_excel1 <- read_excel(path = "dados1.xls") dados_excelx1 <- read_excel(path = "dados1.xlsx") ``` --- ## Arquivos de outros softwares <!-- Para ler dados salvos em extensão de outros softwares: SPSS, STATA e SAS: pacote haven. --> ```r library(haven) dados_stata <- read_stata("dados1.dta") dados_spss <- read_spss("dados1.sav") dados_sas <- read_sas("dados1.sas7bdat") ``` --- # Tratamento de dados A análise de consistência consiste em realizar uma primeira análise dos dados com o intuito de encontrar inconsistências. * boas práticas para nome das variáveis; * identificar erros de digitação; * identificar casos missings e avaliar se a observação está ausente de maneira correta ou não; * identificar as categorias de variáveis qualitativas. --- Para podermos exemplificar utilizaremos um banco de dados com informações sobre o número de telefones por continente em alguns anos do século XIX. Para importar a base de dados: ```r library(readxl) dados <- read_excel("C:/Users/lucas/Desktop/Constat Jr/Minicurso R/apresentation/WorldPhones.xlsx") dados ``` ``` ## # A tibble: 7 x 9 ## Ano `AMERICA DO NOR~ Europe Asia `America do sul` Oceania Africa ## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1951 45939 21574 2876 1815 1646 89 ## 2 1956 60423 29990 4708 2568 2366 1411 ## 3 1957 64721 32510 5230 2695 2526 1546 ## 4 1958 68484 35218 6662 2845 2691 1663 ## 5 1959 71799 37598 6856 3000 2868 1769 ## 6 1960 76036 40341 8220 3145 3054 1905 ## 7 1961 79831 43173 9053 3338 3224 2005 ## # ... with 2 more variables: `America Central` <dbl>, `Ilha do Caribe` <lgl> ``` --- ###Nome das variáveis Utilizaremos as funções tidyverse e janitor para a arrumação da base de dados. ```r library(tidyverse) library(janitor) names(dados) ``` ``` ## [1] "Ano" "AMERICA DO NORTE" "Europe" "Asia" ## [5] "America do sul" "Oceania" "Africa" "America Central" ## [9] "Ilha do Caribe" ``` ```r dados <- clean_names(dados) # a função clean_names() para primeiro ajuste dos nomes das variaveis names(dados) ``` ``` ## [1] "ano" "america_do_norte" "europe" "asia" ## [5] "america_do_sul" "oceania" "africa" "america_central" ## [9] "ilha_do_caribe" ``` --- ###Linhas e colunas vazias Na base de dados em questão, não há linhas vazias, mas em casos que seja necessário eliminar linhas vazias, usaremos o seguinte comando: ```r dados <- remove_empty(dados,"rows") ``` Propositalmente, inclui a coluna "Ilha do Caribe" vazia para podermos eliminá-la com o comando abaixo: ```r dados <- remove_empty(dados,"cols") names(dados) ``` ``` ## [1] "ano" "america_do_norte" "europe" "asia" ## [5] "america_do_sul" "oceania" "africa" "america_central" ``` --- ### Identificar tipo e classe de todas as variáveis da base Para identificar a classe de todas as variáveis que o R está interpretando, usamos a função str(.). ```r # Ver a estrutura dos dados str(dados) ``` ``` ## tibble [7 x 8] (S3: tbl_df/tbl/data.frame) ## $ ano : num [1:7] 1951 1956 1957 1958 1959 ... ## $ america_do_norte: num [1:7] 45939 60423 64721 68484 71799 ... ## $ europe : num [1:7] 21574 29990 32510 35218 37598 ... ## $ asia : num [1:7] 2876 4708 5230 6662 6856 ... ## $ america_do_sul : num [1:7] 1815 2568 2695 2845 3000 ... ## $ oceania : num [1:7] 1646 2366 2526 2691 2868 ... ## $ africa : num [1:7] 89 1411 1546 1663 1769 ... ## $ america_central : num [1:7] 555 733 773 836 911 ... ``` --- ### Conversão do tipo de variáveis Abaixo está a lista das funções para mudança de tipo: * as.character - converte para variável texto. * as.numeric - converte para variável número. * as.factor - converte para variável categórica. * as.integer - converte para variável inteiro. * as.Date - converte para variável data. * as.POSIXct - converte para variável data e hora completa.