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

Autor
Afiliação

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

Meu currículo lattes: acesse aqui

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/

Estes slides tem como base o conteúdo da segunda edição

8 Importação de dados

Pacotes necessários

8.2 Lendo dados de um arquivo

  • CSV = comma-separated values (valores separados por vírgulas)
  • estudantes.csv
ID do Aluno,Nome Completo,Comida Favorita,Plano de Refeição,Idade
1,Sunil Huffmann,Iogurte de Morango,Apenas Almoço,4
2,Barclay Lynn,Batata Frita,Apenas Almoço,5
3,Jayendra Lyne,N/A,Café da Manhã e Almoço,7
4,Leon Rossini,Anchovas,Apenas Almoço,NA
5,Chidiegwu Dunkel,Pizza,Café da Manhã e Almoço,cinco
6,Güvenç Attila,Sorvete,Apenas Almoço,6

Lendo arquivos CSV

Dados do arquivo estudantes.csv como uma tabela.
ID do Aluno Nome Completo Comida Favorita Plano de Refeição Idade
1 Sunil Huffmann Iogurte de Morango Apenas Almoço 4
2 Barclay Lynn Batata Frita Apenas Almoço 5
3 Jayendra Lyne N/A Café da Manhã e Almoço 7
4 Leon Rossini Anchovas Apenas Almoço NA
5 Chidiegwu Dunkel Pizza Café da Manhã e Almoço cinco
6 Güvenç Attila Sorvete Apenas Almoço 6

Lendo arquivos CSV

estudantes <- read_csv("./data/estudantes.csv")
Rows: 6 Columns: 5
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (4): Nome Completo, Comida Favorita, Plano de Refeição, Idade
dbl (1): ID do Aluno

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
estudantes
# A tibble: 6 × 5
  `ID do Aluno` `Nome Completo`  `Comida Favorita`  `Plano de Refeição`    Idade
          <dbl> <chr>            <chr>              <chr>                  <chr>
1             1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2             2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3             3 Jayendra Lyne    N/A                Café da Manhã e Almoço 7    
4             4 Leon Rossini     Anchovas           Apenas Almoço          <NA> 
5             5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6             6 Güvenç Attila    Sorvete            Apenas Almoço          6    
  • read_csv
  • Primeiro argumento: caminho do arquivo
    • caminho = endereço: o arquivo estudantes.csv mora na pasta data
  • O código funciona se o arquivo estudantes.csv estiver na pasta data

Lendo arquivos CSV

  • é possível ler o arquivo direto de uma URL (link) onde ele esteja armazenado
estudantes <- read_csv("https://tinyurl.com/estudcsv")

Conselho prático

Depois de ler os dados, é necessário transformá-los para facilitar o trabalho no restante da análise

  • valores ausentes
  • nomes das variáveis
  • tipos de variáveis

Lidando com códigos para valores ausentes

estudantes
# A tibble: 6 × 5
  `ID do Aluno` `Nome Completo`  `Comida Favorita`  `Plano de Refeição`    Idade
          <dbl> <chr>            <chr>              <chr>                  <chr>
1             1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2             2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3             3 Jayendra Lyne    N/A                Café da Manhã e Almoço 7    
4             4 Leon Rossini     Anchovas           Apenas Almoço          <NA> 
5             5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6             6 Güvenç Attila    Sorvete            Apenas Almoço          6    
  • N/A parece ser um valor ausente válido na coluna Comida Favorita
    • argumento na =
      • padrão: reconhece espaços vazios ("") como NAs

Lidando com códigos para valores ausentes

estudantes <- read_csv("./data/estudantes.csv", 
                       na = c("N/A","")) 

estudantes
# A tibble: 6 × 5
  `ID do Aluno` `Nome Completo`  `Comida Favorita`  `Plano de Refeição`    Idade
          <dbl> <chr>            <chr>              <chr>                  <chr>
1             1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2             2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3             3 Jayendra Lyne    <NA>               Café da Manhã e Almoço 7    
4             4 Leon Rossini     Anchovas           Apenas Almoço          NA   
5             5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6             6 Güvenç Attila    Sorvete            Apenas Almoço          6    

Melhorando os nomes das variáveis

estudantes
# A tibble: 6 × 5
  `ID do Aluno` `Nome Completo`  `Comida Favorita`  `Plano de Refeição`    Idade
          <dbl> <chr>            <chr>              <chr>                  <chr>
1             1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2             2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3             3 Jayendra Lyne    <NA>               Café da Manhã e Almoço 7    
4             4 Leon Rossini     Anchovas           Apenas Almoço          NA   
5             5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6             6 Güvenç Attila    Sorvete            Apenas Almoço          6    

Melhorando os nomes das variáveis

estudantes <- estudantes |> 
  clean_names()

estudantes
# A tibble: 6 × 5
  id_do_aluno nome_completo    comida_favorita    plano_de_refeicao      idade
        <dbl> <chr>            <chr>              <chr>                  <chr>
1           1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2           2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3           3 Jayendra Lyne    <NA>               Café da Manhã e Almoço 7    
4           4 Leon Rossini     Anchovas           Apenas Almoço          NA   
5           5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6           6 Güvenç Attila    Sorvete            Apenas Almoço          6    

Organizando os tipos de variáveis

estudantes
# A tibble: 6 × 5
  id_do_aluno nome_completo    comida_favorita    plano_de_refeicao      idade
        <dbl> <chr>            <chr>              <chr>                  <chr>
1           1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2           2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3           3 Jayendra Lyne    <NA>               Café da Manhã e Almoço 7    
4           4 Leon Rossini     Anchovas           Apenas Almoço          NA   
5           5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6           6 Güvenç Attila    Sorvete            Apenas Almoço          6    
  • plano_de_refeicao: variável categórica (conjunto conhecido de valores possíveis)
  • deveria ser representada como fator
  • forcats::as_factor()

Organizando os tipos de variáveis

estudantes <- read_csv("./data/estudantes.csv",
         na = c("N/A", "")) |> 
  clean_names() |> 
  mutate(
    plano_de_refeicao = as_factor(plano_de_refeicao)
  )

estudantes
# A tibble: 6 × 5
  id_do_aluno nome_completo    comida_favorita    plano_de_refeicao      idade
        <dbl> <chr>            <chr>              <fct>                  <chr>
1           1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2           2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3           3 Jayendra Lyne    <NA>               Café da Manhã e Almoço 7    
4           4 Leon Rossini     Anchovas           Apenas Almoço          NA   
5           5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6           6 Güvenç Attila    Sorvete            Apenas Almoço          6    

Organizando os tipos de variáveis

estudantes
# A tibble: 6 × 5
  id_do_aluno nome_completo    comida_favorita    plano_de_refeicao      idade
        <dbl> <chr>            <chr>              <fct>                  <chr>
1           1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2           2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3           3 Jayendra Lyne    <NA>               Café da Manhã e Almoço 7    
4           4 Leon Rossini     Anchovas           Apenas Almoço          NA   
5           5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6           6 Güvenç Attila    Sorvete            Apenas Almoço          6    
  • idade: variável numérica, mas está como caractere
  • cinco ao invés de 5

Organizando os tipos de variáveis

estudantes <- read_csv("./data/estudantes.csv",
         na = c("N/A", "")) |> 
  clean_names() |> 
  mutate(
    plano_de_refeicao = as_factor(plano_de_refeicao),
    idade = parse_number(if_else(idade == "cinco", "5",idade)) 
  )

estudantes
# A tibble: 6 × 5
  id_do_aluno nome_completo    comida_favorita    plano_de_refeicao      idade
        <dbl> <chr>            <chr>              <fct>                  <dbl>
1           1 Sunil Huffmann   Iogurte de Morango Apenas Almoço              4
2           2 Barclay Lynn     Batata Frita       Apenas Almoço              5
3           3 Jayendra Lyne    <NA>               Café da Manhã e Almoço     7
4           4 Leon Rossini     Anchovas           Apenas Almoço             NA
5           5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço     5
6           6 Güvenç Attila    Sorvete            Apenas Almoço              6

parse_number()

  • Analisa o primeiro número encontrado, descartando todos os caracteres não numéricos antes do primeiro número e todos os caracteres após o primeiro número

if_else()

  • Argumentos: condition, true, false
  • if_else(idade == “cinco”, “5”, idade)
    • condition: idade == “cinco”
    • true: “5”
    • false: idade

Exercícios

Use o link a seguir para baixar um banco de dados no formato CSV e salvá-lo no objeto demograficos. O dados estão separados por ,

"https://tinyurl.com/ddmge99"

Resposta

demograficos <- read_csv("https://tinyurl.com/ddmge99")

Exercícios

Agora, faça alterações no banco de modo que o trabalho em análises posteriores seja facilitado

Resposta - parte 1: dando uma olhada nos dados

demograficos
# A tibble: 5 × 5
     ID `Nome Completo` Idade         Sexo      `Estado Civil`
  <dbl> <chr>           <chr>         <chr>     <chr>         
1     1 João da Silva   trinta e dois Masculino Casado        
2     2 Maria de Souza  27            Feminino  Solteira      
3     3 José Pereira    45            Masculino 999           
4     4 Ana Santos      36            Feminino  Casada        
5     5 Pedro Almeida   41            Masculino Solteiro      

Resposta - parte 2: corrigindo valores ausentes

demograficos
# A tibble: 5 × 5
     ID `Nome Completo` Idade         Sexo      `Estado Civil`
  <dbl> <chr>           <chr>         <chr>     <chr>         
1     1 João da Silva   trinta e dois Masculino Casado        
2     2 Maria de Souza  27            Feminino  Solteira      
3     3 José Pereira    45            Masculino 999           
4     4 Ana Santos      36            Feminino  Casada        
5     5 Pedro Almeida   41            Masculino Solteiro      
  • 999 é uma codificação comum para valores ausentes

Resposta - parte 2: corrigindo valores ausentes

demograficos <- read_csv("https://tinyurl.com/ddmge99",
         na = c("", "999"))
demograficos
# A tibble: 5 × 5
     ID `Nome Completo` Idade         Sexo      `Estado Civil`
  <dbl> <chr>           <chr>         <chr>     <chr>         
1     1 João da Silva   trinta e dois Masculino Casado        
2     2 Maria de Souza  27            Feminino  Solteira      
3     3 José Pereira    45            Masculino <NA>          
4     4 Ana Santos      36            Feminino  Casada        
5     5 Pedro Almeida   41            Masculino Solteiro      

Resposta - parte 3: corrigindo o nome das variáveis

library(janitor)

demograficos <- read_csv("https://tinyurl.com/ddmge99",
                         na = c("", "999")) |> 
  clean_names()
demograficos
# A tibble: 5 × 5
     id nome_completo  idade         sexo      estado_civil
  <dbl> <chr>          <chr>         <chr>     <chr>       
1     1 João da Silva  trinta e dois Masculino Casado      
2     2 Maria de Souza 27            Feminino  Solteira    
3     3 José Pereira   45            Masculino <NA>        
4     4 Ana Santos     36            Feminino  Casada      
5     5 Pedro Almeida  41            Masculino Solteiro    

Resposta - parte 4: corrigindo as variáveis categóricas

  • sexo e estado_civil: variáveis categóricas (conjunto conhecido de valores possíveis)
  • deveriam ser representada como fator
  • forcats::as_factor()
demograficos <- read_csv("https://tinyurl.com/ddmge99",
                         na = c("", "999")) |> 
  clean_names() |> 
  mutate(
    sexo = as_factor(sexo),
    estado_civil = as_factor(sexo)
  )
demograficos
# A tibble: 5 × 5
     id nome_completo  idade         sexo      estado_civil
  <dbl> <chr>          <chr>         <fct>     <fct>       
1     1 João da Silva  trinta e dois Masculino Casado      
2     2 Maria de Souza 27            Feminino  Solteira    
3     3 José Pereira   45            Masculino <NA>        
4     4 Ana Santos     36            Feminino  Casada      
5     5 Pedro Almeida  41            Masculino Solteiro    

Reposta - parte 5: corrigindo a variável numérica

  • idade: trinta e dois
demograficos <- read_csv("https://tinyurl.com/ddmge99",
                         na = c("", "999")) |> 
  clean_names() |> 
  mutate(
    sexo = as_factor(sexo),
    estado_civil = as_factor(estado_civil),
    idade = parse_number(if_else(idade == "trinta e dois", "32", idade))
  )
demograficos
# A tibble: 5 × 5
     id nome_completo  idade sexo      estado_civil
  <dbl> <chr>          <dbl> <fct>     <fct>       
1     1 João da Silva     32 Masculino Casado      
2     2 Maria de Souza    27 Feminino  Solteira    
3     3 José Pereira      45 Masculino <NA>        
4     4 Ana Santos        36 Feminino  Casada      
5     5 Pedro Almeida     41 Masculino Solteiro    

E se os decimais forem separados por vírgula?

  • CSV: valores separados por vírgulas
  • Brasil: casas decimais são separadas por vírgula
    • 2,4 e 5,7 e 6,7
a,b,c
2,4,5,7,6,7

E se os decimais forem separados por vírgula?

# A tibble: 1 × 4
      a     b     c  ...4
  <dbl> <dbl> <dbl> <dbl>
1     2     4     5   767
# A tibble: 1 × 3
      a     b     c
  <dbl> <dbl> <dbl>
1   2.4   5.7   6.7

read_csv2()

  • Decimais separados por ,: valores separados por ;
    • 2,4;5,7;6,7
  • read_csv2(): lê arquivo separados por ;
  • academia.csv
ID;Nome;Idade;Sexo;Altura;Peso;Cidade
1;João;25;Masculino;1,75;70,25;Sobral
2;Maria;32;Feminino;1,63;58,50;Fortaleza
3;Pedro;45;Masculino;1,80;85,75;Pacajus
4;Ana;28;Feminino;1,68;60,00;Fortaleza
5;Carlos;33;Masculino;1,82;77,50;Sobral

read_csv2()

Dados do arquivo academia.csv como uma tabela.
ID Nome Idade Sexo Altura Peso Cidade
1 João 25 Masculino 1.75 70.25 Sobral
2 Maria 32 Feminino 1.63 58.50 Fortaleza
3 Pedro 45 Masculino 1.80 85.75 Pacajus
4 Ana 28 Feminino 1.68 60.00 Fortaleza
5 Carlos 33 Masculino 1.82 77.50 Sobral

read_csv2()

academia <- read_csv2("./data/academia.csv")

academia
# A tibble: 5 × 7
     ID Nome   Idade Sexo      Altura  Peso Cidade   
  <dbl> <chr>  <dbl> <chr>      <dbl> <dbl> <chr>    
1     1 João      25 Masculino   1.75  70.2 Sobral   
2     2 Maria     32 Feminino    1.63  58.5 Fortaleza
3     3 Pedro     45 Masculino   1.8   85.8 Pacajus  
4     4 Ana       28 Feminino    1.68  60   Fortaleza
5     5 Carlos    33 Masculino   1.82  77.5 Sobral   

Outros argumentos

  • read_csv() pode ler sequências de texto que você criou e formatou como um arquivo CSV
read_csv(
  "a,b,c
  1,2,3
  4,5,6"
)
# A tibble: 2 × 3
      a     b     c
  <dbl> <dbl> <dbl>
1     1     2     3
2     4     5     6

Outros argumentos

  • read_csv(): primeira linha para os nomes das colunas
  • Não é incomum que algumas linhas de metadados sejam incluídas na parte superior do arquivo
  • skip = n: pular as primeiras n linhas
  • comment = "#": eliminar todas as linhas que começam, por exemplo, com “#”

skip = n

read_csv(
   "A primeira linha de metadados
   A segunda linha de metadados
   x,y,z
   1,2,3",
   skip = 2
)
# A tibble: 1 × 3
      x     y     z
  <dbl> <dbl> <dbl>
1     1     2     3

comment = "#"

read_csv(
   "# Um comentário que eu quero pular
   x,y,z
   1,2,3",
   comment = "#"
)
# A tibble: 1 × 3
      x     y     z
  <dbl> <dbl> <dbl>
1     1     2     3

Outros argumentos

  • read_csv(): primeira linha para os nomes das colunas
  • Há casos em que os dados não tem nomes das colunas
  • col_names = F: não tratar a primeira linha como títulos e, em vez disso, rotulá-los sequencialmente de X1 a Xn
read_csv(
  "1,2,3
  4,5,6"
)
# A tibble: 1 × 3
    `1`   `2`   `3`
  <dbl> <dbl> <dbl>
1     4     5     6

col_names = F

read_csv(
  "1,2,3
  4,5,6",
  col_names = F
)
# A tibble: 2 × 3
     X1    X2    X3
  <dbl> <dbl> <dbl>
1     1     2     3
2     4     5     6

col_names =

  • é possível indicar o nome das colunas como um vetor de caracteres
read_csv(
  "1,2,3
  4,5,6",
  col_names = c("x", "y", "z")
)
# A tibble: 2 × 3
      x     y     z
  <dbl> <dbl> <dbl>
1     1     2     3
2     4     5     6

n_max =

  • é possível indicar o número máximo de linhas que se quer ler
  • se a primeira linha indica os rótulos, ela não conta no número máximo
read_csv(
  "a,b,c
  1,2,3
  4,5,6
  não,não,não
  não,não,não",
  n_max = 3
)
# A tibble: 3 × 3
  a     b     c    
  <chr> <chr> <chr>
1 1     2     3    
2 4     5     6    
3 não   não   não  
read_csv(
  "a,b,c
  1,2,3
  4,5,6
  não,não,não
  não,não,não",
  n_max = 2
)
# A tibble: 2 × 3
      a     b     c
  <dbl> <dbl> <dbl>
1     1     2     3
2     4     5     6

8.5 Exportando um arquivo

  • write_csv()
    • as informações do tipo de variável configuradas são perdidas
estudantes
# A tibble: 6 × 5
  id_do_aluno nome_completo    comida_favorita    plano_de_refeicao      idade
        <dbl> <chr>            <chr>              <fct>                  <dbl>
1           1 Sunil Huffmann   Iogurte de Morango Apenas Almoço              4
2           2 Barclay Lynn     Batata Frita       Apenas Almoço              5
3           3 Jayendra Lyne    <NA>               Café da Manhã e Almoço     7
4           4 Leon Rossini     Anchovas           Apenas Almoço             NA
5           5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço     5
6           6 Güvenç Attila    Sorvete            Apenas Almoço              6

write_csv()

estudantes |>
  write_csv("./data/estudantes_edit.csv")
read_csv("./data/estudantes_edit.csv")
# A tibble: 6 × 5
  id_do_aluno nome_completo    comida_favorita    plano_de_refeicao      idade
        <dbl> <chr>            <chr>              <chr>                  <dbl>
1           1 Sunil Huffmann   Iogurte de Morango Apenas Almoço              4
2           2 Barclay Lynn     Batata Frita       Apenas Almoço              5
3           3 Jayendra Lyne    <NA>               Café da Manhã e Almoço     7
4           4 Leon Rossini     Anchovas           Apenas Almoço             NA
5           5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço     5
6           6 Güvenç Attila    Sorvete            Apenas Almoço              6

Lendo arquivos do SPSS

read_sav()

estudantes_sav <- read_sav("https://tinyurl.com/estudansav")
estudantes_sav
# A tibble: 6 × 5
  IDdoAluno NomeCompleto     PlanodeRefeicao            ComidaFavorita     Idade
      <dbl> <chr>            <dbl+lbl>                  <dbl+lbl>          <chr>
1         1 Sunil Huffmann   1 [Apenas Almoço]           3 [Iogurte de Mo… 4    
2         2 Barclay Lynn     1 [Apenas Almoço]           2 [Batata Frita]  5    
3         3 Jayendra Lyne    2 [Café da Manhã e Almoço] NA                 7    
4         4 Leon Rossini     1 [Apenas Almoço]           1 [Anchovas]      NA   
5         5 Chidiegwu Dunkel 2 [Café da Manhã e Almoço]  5 [Pizza]         cinco
6         6 Güvenç Attila    1 [Apenas Almoço]           6 [Sorvete]       6    

Lendo arquivos do excel

read_excel()

  • Por padrão, vai ler a primeira planilha
read_excel("./data/exemplo_excel.xlsx")
# A tibble: 5 × 7
     ID Nome   Idade Sexo      Altura  Peso Cidade   
  <dbl> <chr>  <dbl> <chr>      <dbl> <dbl> <chr>    
1     1 João      25 Masculino   1.75  70.2 Sobral   
2     2 Maria     32 Feminino    1.63  58.5 Fortaleza
3     3 Pedro     45 Masculino   1.8   85.8 Pacajus  
4     4 Ana       28 Feminino    1.68  60   Fortaleza
5     5 Carlos    33 Masculino   1.82  77.5 Sobral   

Obtendo os nomes das planilhas

excel_sheets("./data/exemplo_excel.xlsx")
[1] "academia"     "demograficos" "estudantes"  

Lendo uma planilha selecionada

  • sheet =: seleciona a planilha desejada
read_excel("./data/exemplo_excel.xlsx",
           sheet = "estudantes")
# A tibble: 6 × 5
  `ID do Aluno` `Nome Completo`  `Comida Favorita`  `Plano de Refeição`    Idade
          <dbl> <chr>            <chr>              <chr>                  <chr>
1             1 Sunil Huffmann   Iogurte de Morango Apenas Almoço          4    
2             2 Barclay Lynn     Batata Frita       Apenas Almoço          5    
3             3 Jayendra Lyne    N/A                Café da Manhã e Almoço 7    
4             4 Leon Rossini     Anchovas           Apenas Almoço          NA   
5             5 Chidiegwu Dunkel Pizza              Café da Manhã e Almoço cinco
6             6 Güvenç Attila    Sorvete            Apenas Almoço          6    

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