Introdução ao R para análise de dados em Psicologia

Francisco Pablo Huascar Aragão Pinheiro

Quem sou eu

  • Psicólogo (UFC)
  • Mestre em Psicologia (UFC)
  • Doutor em educação (UFC)
  • Professor do campus Sobral da UFC
  • Recentemente, um entusiasta do R

R for Data Science

Livro base para o mini curso

Capa do livro R for Data Science. Uma coruja se destaca na ilustração

R for Data Science

  • Neste link você pode acessar a primeira edição do livro:

https://r4ds.had.co.nz/

  • E aqui você pode acessar a segunda edição que ainda está sendo finalizada:

https://r4ds.hadley.nz/

27 Iteração

27.1 Introdução

  • Iteração: executar repetidamente a mesma ação em diferentes objetos
  • Evitar copiar e colar código mais de 2 vezes
    • Erros que se propagam no código

Pacotes

Criação de um banco dummy

df <- tibble(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)
df
# A tibble: 10 × 4
        a      b       c      d
    <dbl>  <dbl>   <dbl>  <dbl>
 1 -1.07  -1.52   0.0248  1.18 
 2 -0.854  0.551  1.63    1.30 
 3  1.80   1.08   2.67   -0.365
 4  0.641  0.777  1.19   -0.742
 5 -0.323  0.230  0.598  -0.330
 6 -0.627  0.106  2.81   -1.63 
 7 -0.978  1.18  -1.83    1.69 
 8  0.473 -0.651  0.708  -0.341
 9 -0.678 -0.163  0.898   0.786
10 -0.792 -1.81  -1.73    0.790

Exemplos de repetição de código

df |> summarize(
  n = n(),
  a = median(a),
  b = median(b),
  c = median(c),
  d = median(d),
)
# A tibble: 1 × 5
      n      a     b     c     d
  <int>  <dbl> <dbl> <dbl> <dbl>
1    10 -0.653 0.168 0.803 0.228
  • Repetir a digitação de median() várias vezes ou copiar e colar

across()

  • .cols =: especifica quais colunas vão estar na iteração
  • .fns =: diz o que fazer com as colunas
    • Qual função aplicar
df |> 
  summarise(
    across(.cols = a:d,.fns = median)
  )
# A tibble: 1 × 4
       a     b     c     d
   <dbl> <dbl> <dbl> <dbl>
1 -0.653 0.168 0.803 0.228

across()

  • É possível omitir os argumentos .cols e .fns
df |> 
  summarise(
    across(a:d, mean)
  )
# A tibble: 1 × 4
       a       b     c     d
   <dbl>   <dbl> <dbl> <dbl>
1 -0.242 -0.0210 0.697 0.233

Exercícios

No banco de dados economics calcule a média das variávels pce, pop e psavert usando a função across

Resposta - parte 1

glimpse(economics)
Rows: 574
Columns: 6
$ date     <date> 1967-07-01, 1967-08-01, 1967-09-01, 1967-10-01, 1967-11-01, …
$ pce      <dbl> 506.7, 509.8, 515.6, 512.2, 517.4, 525.1, 530.9, 533.6, 544.3…
$ pop      <dbl> 198712, 198911, 199113, 199311, 199498, 199657, 199808, 19992…
$ psavert  <dbl> 12.6, 12.6, 11.9, 12.9, 12.8, 11.8, 11.7, 12.3, 11.7, 12.3, 1…
$ uempmed  <dbl> 4.5, 4.7, 4.6, 4.9, 4.7, 4.8, 5.1, 4.5, 4.1, 4.6, 4.4, 4.4, 4…
$ unemploy <dbl> 2944, 2945, 2958, 3143, 3066, 3018, 2878, 3001, 2877, 2709, 2…

Reposta - parte 2

economics |> 
  summarise(
    across(pce:psavert, mean)
  )
# A tibble: 1 × 3
    pce     pop psavert
  <dbl>   <dbl>   <dbl>
1 4820. 257160.    8.57

Selecionando columas com .cols

Selecionando columas com .cols

glimpse(economics)
Rows: 574
Columns: 6
$ date     <date> 1967-07-01, 1967-08-01, 1967-09-01, 1967-10-01, 1967-11-01, …
$ pce      <dbl> 506.7, 509.8, 515.6, 512.2, 517.4, 525.1, 530.9, 533.6, 544.3…
$ pop      <dbl> 198712, 198911, 199113, 199311, 199498, 199657, 199808, 19992…
$ psavert  <dbl> 12.6, 12.6, 11.9, 12.9, 12.8, 11.8, 11.7, 12.3, 11.7, 12.3, 1…
$ uempmed  <dbl> 4.5, 4.7, 4.6, 4.9, 4.7, 4.8, 5.1, 4.5, 4.1, 4.6, 4.4, 4.4, 4…
$ unemploy <dbl> 2944, 2945, 2958, 3143, 3066, 3018, 2878, 3001, 2877, 2709, 2…

Selecionando columas com .cols

economics |> 
  summarise(
    across(starts_with("p"),  mean)
  ) 
# A tibble: 1 × 3
    pce     pop psavert
  <dbl>   <dbl>   <dbl>
1 4820. 257160.    8.57

Exercícios

Salve o banco de dados a seguir no objeto treinos e, em seguida, dê uma olhada no arquivo

treinos <- read_csv("https://tinyurl.com/treinndf")

Resposta

glimpse(treinos)
Rows: 5
Columns: 14
$ idade              <dbl> 20, 30, 40, 50, 60
$ altura             <dbl> 1.6, 1.7, 1.8, 1.9, 2.0
$ genero             <chr> "masculino", "masculino", "feminino", "feminino", "…
$ fumante            <chr> "sim", "não", "não", "sim", "sim"
$ risco_cardiaco     <chr> "sim", "não", "sim", "não", "sim"
$ peso_1             <dbl> 60, 70, 80, 90, 100
$ peso_2             <dbl> 61, 71, 81, 91, 101
$ peso_3             <dbl> 62, 72, 82, 92, 102
$ refeicao_preferida <chr> "arroz e feijão", "pizza", "macarrão", "sushi", "so…
$ treinos_por_semana <dbl> 3, 4, 5, 6, 7
$ treinador          <chr> "Julia", "Hadley", "Jesse", "Julia", "Hadley"
$ total_colesterol   <dbl> 200, 220, 240, 260, 280
$ ruim_colesterol    <dbl> 100, 120, 140, 160, 180
$ bom_colesterol     <dbl> 100, 100, 100, 100, 100

Exercícios

Calcule a média das variáveis que iniciam com peso usando uma das especificações de seleção que foi apresentada anteriormente

Resposta

treinos |> 
  summarise(
    across(starts_with("peso"), mean)
  )
# A tibble: 1 × 3
  peso_1 peso_2 peso_3
   <dbl>  <dbl>  <dbl>
1     80     81     82

Exercícios

Calcule a média das variáveis que terminam com colesterol usando uma das especificações de seleção que foi apresentada anteriormente

Resposta

treinos |> 
  summarise(
    across(ends_with("colesterol"), mean)
  )
# A tibble: 1 × 3
  total_colesterol ruim_colesterol bom_colesterol
             <dbl>           <dbl>          <dbl>
1              240             140            100

Selecionando columas com .cols

  • Opções espefícidas de across()
    • everything(): seleciona toda coluna que não seja de agrupamento
    • where(): seleciona colunas baseado seus tipos

everything()

df |> 
  slice_head(n = 5)
# A tibble: 5 × 4
       a      b      c      d
   <dbl>  <dbl>  <dbl>  <dbl>
1 -1.07  -1.52  0.0248  1.18 
2 -0.854  0.551 1.63    1.30 
3  1.80   1.08  2.67   -0.365
4  0.641  0.777 1.19   -0.742
5 -0.323  0.230 0.598  -0.330
df |> 
  summarise(
    across(everything(),mean)
  )
# A tibble: 1 × 4
       a       b     c     d
   <dbl>   <dbl> <dbl> <dbl>
1 -0.242 -0.0210 0.697 0.233

where()

  • where(is.numeric) seleciona todas as colunas numéricas.
  • where(is.character) seleciona todas as colunas de string.
  • where(is.Date) seleciona todas as colunas de data.
  • where(is.POSIXct) seleciona todas as colunas de data e hora.
  • where(is.logical) seleciona todas as colunas lógicas.

where()

glimpse(economics)
Rows: 574
Columns: 6
$ date     <date> 1967-07-01, 1967-08-01, 1967-09-01, 1967-10-01, 1967-11-01, …
$ pce      <dbl> 506.7, 509.8, 515.6, 512.2, 517.4, 525.1, 530.9, 533.6, 544.3…
$ pop      <dbl> 198712, 198911, 199113, 199311, 199498, 199657, 199808, 19992…
$ psavert  <dbl> 12.6, 12.6, 11.9, 12.9, 12.8, 11.8, 11.7, 12.3, 11.7, 12.3, 1…
$ uempmed  <dbl> 4.5, 4.7, 4.6, 4.9, 4.7, 4.8, 5.1, 4.5, 4.1, 4.6, 4.4, 4.4, 4…
$ unemploy <dbl> 2944, 2945, 2958, 3143, 3066, 3018, 2878, 3001, 2877, 2709, 2…
economics |> 
  summarise(
    across(where(is.numeric), mean)
  )
# A tibble: 1 × 5
    pce     pop psavert uempmed unemploy
  <dbl>   <dbl>   <dbl>   <dbl>    <dbl>
1 4820. 257160.    8.57    8.61    7771.

Exercícios

Chamando mais de um função dentro de .fns

  • Use a função list() para chamar mais de um função
  • É importante nomear as funções: nome = funcão
economics |> 
  summarise(
    across(pce:pop, list(
      M = mean, DP = sd,
      MIN = min, MAX = max)
      )
  ) 
# A tibble: 1 × 8
  pce_M pce_DP pce_MIN pce_MAX   pop_M pop_DP pop_MIN pop_MAX
  <dbl>  <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>   <dbl>
1 4820.  3557.    507.  12194. 257160. 36682.  198712 320402.

Exercícios

Usando argumentos dentro das funções chamadas em .fns

glimpse(flights)
Rows: 336,776
Columns: 19
$ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2…
$ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 558, …
$ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 600, …
$ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2, -1…
$ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 849,…
$ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 851,…
$ arr_delay      <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7, -1…
$ carrier        <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6", "…
$ flight         <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301, 4…
$ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N394…
$ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LGA",…
$ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IAD",…
$ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149, 1…
$ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 733, …
$ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6…
$ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0…
$ time_hour      <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 0…

Usando argumentos dentro das funções chamadas em .fns

flights |> 
  summarise(
    across(ends_with("delay"), mean)
  )
# A tibble: 1 × 2
  dep_delay arr_delay
      <dbl>     <dbl>
1        NA        NA
  • Se há um caso com valores ausentes (NA) a função retorna NA
  • É necessário usar o argumento na.rm = T para resolver esse problema

Usando argumentos dentro das funções chamadas em .fns

  • É possível chamar criar uma função anônima usando \(x)
  • x vai representar todas as variáveis para s quais queremos obter a média
flights |> 
  summarise(
    across(ends_with("delay"),
           \(x) mean(x, na.rm = T))
  )
# A tibble: 1 × 2
  dep_delay arr_delay
      <dbl>     <dbl>
1      12.6      6.90

Usando argumentos dentro das funções chamadas em .fns

  • Também possível fazer o mesmo chando várias funções dentro de .fns com list()
flights |> 
  summarise(
    across(ends_with("delay"),
           list(
             M = \(x) mean(x, na.rm = T),
             SD = \(x) sd(x, na.rm = T)
           ))
  )
# A tibble: 1 × 4
  dep_delay_M dep_delay_SD arr_delay_M arr_delay_SD
        <dbl>        <dbl>       <dbl>        <dbl>
1        12.6         40.2        6.90         44.6

Exercícios

Compartilhar conhecimento sempre!

O código e as imagens utilizados para a construção desse slide estão disponíveis no link a seguir:

https://github.com/pablo-huascar/rpsi