Capítulo 2 Introdução a R

2.1 Vídeo 1

2.2 Usando o RStudio

Leia uma introdução ao R e ao RStudio no livro Ciência de Dados com R.

Ali, você vai encontrar exemplos e exercícios.

2.3 RMarkdown

Para ver uma referência sobre a sintaxe do RMarkdown, vá ao menu Help do RStudio, escolha Cheatsheets e, a seguir, R Markdown Cheat Sheet ou R Markdown Reference Guide.

2.4 Apresentação

R é várias linguagens em uma:

  • R base,

  • OO (S3),

  • OO (S4),

  • Tidyverse (pacote usado para Ciência de Dados e gráficos).

2.5 Tudo é vetor

  • Usamos a função c() (concatenate) para criar vetores:

    vetor <- c(1, 2, 4, 7, 0, -1)
    vetor
    ## [1]  1  2  4  7  0 -1
  • Em um vetor, todos os elementos precisam ser do mesmo tipo.

  • Mesmo que você use c(c(...), c(...)), o vetor criado vai ter um único nível. Não existem vetores aninhados.

    v1 <- c(1, 2)
    v2 <- c(3, 4, 5)
    v3 <- c(v1, v2)
    v3
    ## [1] 1 2 3 4 5
  • Mais adiante, veremos como criar listas, que podem ter elementos de tipos diferentes e sublistas aninhadas.

  • Outras maneiras de criar vetores:

    • O operador : constrói sequências:

      1:10
      ##  [1]  1  2  3  4  5  6  7  8  9 10
      10:1
      ##  [1] 10  9  8  7  6  5  4  3  2  1
      0.5:10.5
      ##  [1]  0,5  1,5  2,5  3,5  4,5  5,5  6,5  7,5  8,5  9,5 10,5
      0.5:10
      ##  [1] 0,5 1,5 2,5 3,5 4,5 5,5 6,5 7,5 8,5 9,5
    • A função seq permite especificar um incremento diferente de \(1\) e \(-1\):

      seq(1, 10)
      ##  [1]  1  2  3  4  5  6  7  8  9 10
      seq(10, 1)
      ##  [1] 10  9  8  7  6  5  4  3  2  1
      seq(1, 10, 0.5)
      ##  [1]  1,0  1,5  2,0  2,5  3,0  3,5  4,0  4,5  5,0  5,5  6,0  6,5  7,0  7,5  8,0  8,5
      ## [17]  9,0  9,5 10,0
    • A função rep cria vetores com elementos repetidos:

      rep(1, 10)
      ##  [1] 1 1 1 1 1 1 1 1 1 1
      rep(c(1, 2), 10)
      ##  [1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
      rep(c(1, 2), each = 10)
      ##  [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2
      rep(c(1, 2), c(3, 4))
      ## [1] 1 1 1 2 2 2 2
  • O número que aparece na saída, entre colchetes, é o índice do primeiro elemento daquela linha:

    rep(1, 1000)
    ##    [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##   [40] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##   [79] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [118] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [157] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [196] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [235] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [274] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [313] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [352] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [391] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [430] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [469] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [508] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [547] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [586] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [625] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [664] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [703] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [742] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [781] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [820] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [859] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [898] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [937] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    ##  [976] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  • Vetores começam no índice 1!!!!

  • Tudo é vetor:

    10
    ## [1] 10
    ## [1] TRUE
    length(10)
    ## [1] 1
  • O valor NA significa ausência de informação:

    notas <- c(10, 8, NA, 7, 10)
    notas
    ## [1] 10  8 NA  7 10

2.6 Operações com vetores

  • Adição e outras operações aritméticas::

    v3 <- c(10, 20)
    v1
    ## [1] 1 2
    v2
    ## [1] 3 4 5
    v3
    ## [1] 10 20
    • R recicla o vetor mais curto, mas avisa quando o comprimento do maior vetor não é múltiplo inteiro do comprimento do menor vetor.

      v1 + v3
      ## [1] 11 22
      v1 + v2
      ## Warning in v1 + v2: longer object length is not a multiple of shorter object length
      ## [1] 4 6 6
      v1 <- c(1, 2)
      v4 <- c(3, 4, 5, 6, 7, 8)
      v1 + v4
      ## [1]  4  6  6  8  8 10
      v1 - v4
      ## [1] -2 -2 -4 -4 -6 -6
      v1 * v4
      ## [1]  3  8  5 12  7 16
      v1 / v4
      ## [1] 0,3333333 0,5000000 0,2000000 0,3333333 0,1428571 0,2500000
  • Funções úteis para vetores:

    • Somar todos os elementos:

      sum(v4)
      ## [1] 33
    • O valor NA se propaga em operações aritméticas:

      notas
      ## [1] 10  8 NA  7 10
      sum(notas)
      ## [1] NA
    • Para ignorar os valores NA, use o argumento na.rm:

      sum(notas, na.rm = TRUE)
      ## [1] 35
    • Média de todos os elementos:

      mean(notas, na.rm = TRUE)
      ## [1] 8,75
      sum(notas, na.rm = TRUE) / 4
      ## [1] 8,75

2.7 Indexação

  • Com um valor inteiro:

    v5 <- 1:50 * 4
    v5
    ##  [1]   4   8  12  16  20  24  28  32  36  40  44  48  52  56  60  64  68  72  76  80
    ## [21]  84  88  92  96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160
    ## [41] 164 168 172 176 180 184 188 192 196 200
    v5[10]
    ## [1] 40
  • Com um vetor de inteiros:

    v5[1:10]
    ##  [1]  4  8 12 16 20 24 28 32 36 40
    v5[c(2, 10, 13, 30)]
    ## [1]   8  40  52 120
    v5[seq(2, 50, 2)]
    ##  [1]   8  16  24  32  40  48  56  64  72  80  88  96 104 112 120 128 136 144 152 160
    ## [21] 168 176 184 192 200
  • Com um vetor de booleanos, os elementos indexados por TRUE são selecionados:

    v4
    ## [1] 3 4 5 6 7 8
    v4[c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)]
    ## [1] 3 4 7
  • Uma condição produz um vetor de booleanos:

    v4 > 5
    ## [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
  • Logo, podemos indexar com uma condição:

    v4[ v4 > 5 ]
    ## [1] 6 7 8
    v4[ v4 %% 2 != 0 ]
    ## [1] 3 5 7
    notas[!is.na(notas)]
    ## [1] 10  8  7 10
  • Para especificar os elementos a não selecionar, use índices negativos.

    v5
    ##  [1]   4   8  12  16  20  24  28  32  36  40  44  48  52  56  60  64  68  72  76  80
    ## [21]  84  88  92  96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160
    ## [41] 164 168 172 176 180 184 188 192 196 200
    v5[-1]
    ##  [1]   8  12  16  20  24  28  32  36  40  44  48  52  56  60  64  68  72  76  80  84
    ## [21]  88  92  96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164
    ## [41] 168 172 176 180 184 188 192 196 200
    v5[-c(1, 4, 20)]
    ##  [1]   8  12  20  24  28  32  36  40  44  48  52  56  60  64  68  72  76  84  88  92
    ## [21]  96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172
    ## [41] 176 180 184 188 192 196 200

2.8 Vídeo 2

2.9 Simular lançamentos de dados

  • Vamos criar um dado de \(6\) lados. Basta um vetor:

    (dado <- 1:6)
    ## [1] 1 2 3 4 5 6
  • Para lançar este dado uma vez, usamos sample:

    sample(dado, 1)
    ## [1] 5
  • Para lançar o dado várias vezes:

    n <- 6
    sample(dado, n, replace = TRUE)
    ## [1] 4 6 1 4 6 6
  • Observe que, para permitir que o mesmo valor apareça mais de uma vez, precisamos usar replace = TRUE — a amostragem será feita com reposição.

  • Uma função para retornar a soma de 2 dados:

    lancar2 <- function() {
    
      dado <- 1:6
      lancamentos <- sample(dado, size = 2, replace = TRUE)
      sum(lancamentos)
    
    }
    lancar2()
    ## [1] 4
  • Vamos generalizar a função:

    • O número de lados do dado é passado como argumento.

    • A quantidade de dados é passada como argumento.

      lancar <- function(n = 2, k = 6) {
      
        dado <- 1:k
        lancamentos <- sample(dado, size = n, replace = TRUE)
        sum(lancamentos)
      
      }
      lancar()
      ## [1] 11
      lancar(n = 4, k = 10)
      ## [1] 23
  • Vamos lançar os \(2\) dados \(10\) mil vezes, usando a função replicate:

    resultados <- replicate(1e4, lancar())

2.10 Visualização

  • A função qplot, do pacote tidyverse, produz um gráfico adequado aos argumentos recebidos — aqui, um histograma:

    qplot(resultados, bins = 11)
    ## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
    ## This warning is displayed once every 8 hours.
    ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    ## generated.
  • Em um capítulo sobre visualização, você vai aprender a configurar melhor a aparência de gráficos como este.

2.11 Dados viciados

  • Vamos modificar a função lancar para receber um vetor com as probabilidades dos lados:

    lancar <- function(
      qtde = 2, 
      lados = 6, 
      probs = rep(1/lados, lados)
    ) {
    
      dado <- 1:lados
      resultados <- sample(
        dado, 
        size = qtde, 
        replace = TRUE, 
        prob = probs
      )
      sum(resultados)
    
    }
  • Lançando dados viciados:

    resultados <- replicate(1e4, lancar(probs = c(1/2, rep(1/10, 5))))
    qplot(resultados, bins = 11)

2.12 Exercícios

  1. Para criar sua conta no RStudio Cloud, acesse https://rstudio.cloud/.

  2. Se você preferir instalar o R no seu computador, acesse

  3. Abra o RStudio Cloud ou o seu RStudio instalado localmente.

  4. Crie um novo projeto. Sempre trabalhe em projetos para ter seus arquivos organizados.

  5. Para instalar o swirl (pacote do R para exercícios interativos), execute o seguinte comando no console do RStudio:

  6. Para instalar os exercícios de introdução a R, execute os seguintes comandos no console do RStudio:

    library(swirl)
    install_course_github('fnaufel', 'introR')
  7. Mude o idioma para português e execute o swirl.

    select_language('portuguese', append_rprofile = TRUE)
    swirl()
  8. Na primeira execução, você vai precisar se identificar (qualquer nome serve). Com essa identificação, o swirl vai registrar o seu progresso nas lições.

  9. No swirl, as perguntas são mostradas no console. Você também deve responder no console.

  10. Às vezes, um script será aberto no editor de textos para que você complete um programa. Quando seu programa estiver pronto, salve o arquivo e digite submit() no console para o swirl processar o script.

  11. O swirl dá instruções claras no console. Na dúvida, digite info() no prompt do R (>).

  12. Se, em vez do prompt do R, o console mostrar reticências (...), tecle Enter.

  13. Se nada funcionar, tecle ESC.

  14. Para sair do swirl(), digite bye() no prompt do R.

  15. Para voltar para os exercícios, digite

  16. Se, quando você tentar instalar os exercícios, acontecer um erro, desinstale todos os cursos com os comandos

    e tente instalar os exercícios novamente.