Introdução a Análise de Dados com R e RStudio

Author
Affiliation

Prof. Dr. Dennison Carvalho

Faculdade de Estatística/ICEN/UFPA

Em pesquisas feitas durante o decorrer de um curso de graduação e/ou pós-graduação, a análise dos dados destas pesquisas pode ser um desafio para muitos estudantes. Dominar uma linguagem de programação acessível e gratuita é um importante meio de vencer tais desafios. Pesquisadores das mais diversas áreas como educação, biologia, psicologia, medicina, sociologia, etc, usam o R como linguagem de programação padrão para fazer suas análises, do simples ao avançado, no que diz respeito a análise estatística de dados. Este é um texto introdutório que traz os comandos básicos para usuários que tenham o conhecimento mínimo de informática e que nunca tiveram contato com o R ou qualquer outra linguagem de programação.

1 Algumas interfaces

https://www.r-project.org/ \(\longrightarrow\) R base

https://posit.co/download/rstudio-desktop/ \(\longrightarrow\) RStudio

https://posit.cloud/ \(\longrightarrow\) RStudio online

https://colab.google/ \(\longrightarrow\) R online

2 Comandos básicos do R

  • O R vem com as configurações mínimas ao ser instalado. Para realizar tarefas mais específicas pode ser necessário instalar pacotes adicionais (packages), clicando em “pacotes>>instalar pacotes”;

  • É necessário escolher o CRAN (Comprehensive R Archive Network), que são arquivos disponibilizados na rede por diversas IES do mundo inteiro, inclusive do Brasil.

  • O R é case-sensitive, isto é, ele diferencia letras minúsculas de maiúsculas;

  • O separador de casas decimais é o “.”;

  • A vírgula é usada para separar argumentos;

  • O prompt do R é o sinal de maior “>”;

  • Após instalarmos algum pacote sempre será necessário carregá-lo com o comando: library(“nome do pacote”);

  • Para verificar como citar o pacote instalado digite: citation(“nome do pacote”);

  • Para obter ajuda dos arquivos do R use o comando help(nome da função).

Ajuda

- Exemplos:
# help(sqrt) #ajuda sobre a função raiz quadrada
# help(lm) # ajuda sobre a função linear models
# citation("ggplot2") # mostra como o pacote deve ser citado

Demonstrações gráficas

- Exemplos:
#demo(graphics) #pressione Enter 
#demo(persp)
#demo(image)
Note
  • O símbolo # representa um comentário. Podemos usá-lo para o R não compilar (rodar) o que estiver após este símbolo.
  • Um pacote amplamente utilizado para contrução de gráficos é o ggplot.

Continhas no R (modo calculadora)

# soma
 2+2-(2+6)+(2)
[1] -2
# multiplicação
6 + (6*78)
[1] 474
# Divisão
4/(3+2)
[1] 0.8
# potência
2**3
[1] 8
# potência
2^3
[1] 8
2^(3)
[1] 8

2.1 Funções do R

  • nome da função (argumento 1, argumento 2,... )

    • dentro dos parênteses colocamos os argumentos da função.

    • os argumentos são separados por vírgula.

    • Exemplos:

mean(...): calcula a média aritmética.

sd(...): calcula o desvio padrão.

lm(...): estima os parâmetros de um modelo de regressão linear.

2.2 Criando objetos/vetores com valores numéricos

Vamos crias um vetor de notas de 10 alunos de uma turma. A função length(notas) fornece o número de observações (n) dentro do objeto.

Note

A letra c() antes dos parênteses significa concatenar (colocar junto).

notas = c(9,6,8,5,7,8,6,9,10,6)
print(notas)
 [1]  9  6  8  5  7  8  6  9 10  6
length(notas)
[1] 10

Para objetos com letras (variáveis qualitativas), basta colocar cada observação entre aspas.

Para listar quais objetos temos salvo utiliza-se a função ls().

Para remover um objeto: rm("nome do objeto").

letras<-c("a","b","c","d")
print(letras)
[1] "a" "b" "c" "d"
ls()
[1] "letras" "notas" 

2.3 Condicionantes

Podemos “perguntar” ao R se algo é verdade ou não a partir de operadores simples, como por exemplo:

1<5 # menor
[1] TRUE
2==2.0001 # igual
[1] FALSE
sqrt(25) != 6 # diferente
[1] TRUE
n1 = 8
n2 = 8.1
teste = n1>n2
teste
[1] FALSE
ifelse(teste, "n1 maior que n2","n2 é maior que n1")
[1] "n2 é maior que n1"

2.4 Matrizes

Para inserir uma matriz no R utiliza-se a função matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL). Note que, basta colocar como argumentos o conjunto de dados e indicar o número de linhas e de colunas da matriz.

M1 = matrix(data = 1:9, nrow = 3, ncol = 3)

print(M1)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

Observe que a matriz foi organizada por default por colunas. Entretanto, podemos mudar isso para linhas utilizando-se o argumento byrow = TRUE na função matrix.

M2 = matrix(data = 1:9, nrow = 3, ncol = 3, byrow = TRUE)

print(M2)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
  • Índices das matrizes

Exemplo: Uma seleção de 4 firmas de ração de Minas Gerais foi obtida para avaliar a venda de rações. Cada observação bivariada forneceu a quantidade de sacos de ração vendidos e a quantidade de reais de cada venda. Os dados obtidos na forma tabular são:

\[\begin{eqnarray*} \begin{array}{cc}\hline \text{Vendas (R\$)} & \text{Quantidade} \\ \hline 80 & 10 \\ 120 & 12 \\ 90 & 6 \\ 110 & 8 \\ \hline \end{array} \end{eqnarray*}\]

M_E1 = matrix(c(80,120,90,110,10,12,6,8),4,2)
print(M_E1)
     [,1] [,2]
[1,]   80   10
[2,]  120   12
[3,]   90    6
[4,]  110    8

Pode-se acessar os elementos de uma matriz usando o nome do objeto (matriz) seguido de colchetes. Para acessar o segundo elemento da variável 1, no exemplo anterior, M_E1[2,1]. Para o terceiro elemento da variável 2, M_E1[3,2]. E, para selecionar todos os elementos da variável 1, M_E1[,1].

M_E1[2,1] # segundo elemento da variável 1
[1] 120
M_E1[3,2] # terceiro elemento da variável 2
[1] 6
M_E1[,1] # todos os elementos da variável 1
[1]  80 120  90 110

2.5 Manipulando um banco de dados (BD)

A manipulação de um banco de dados a partir o R base é feita de forma análoga às matrizes. A função data.frame tem a mesma lógica de manipulação matricial com mais algumas vantagens.

Vamos estudar alguns recursos simples e importantes dessa função a partir do famoso banco de dados Iris presente na base de dados do R.

Note

A função str mostra que o objeto df_irisé do tipo dataframe, ou seja, banco de dados, e possui 150 observações (linhas) e 5 variáveis (colunas). Tal estrutura é a mesma de uma matriz qualquer.

data("iris") # carregando o banco de dados
df_iris = iris # atribuindo um nome para este BD
str(df_iris) # verificando a estrutura deste objeto
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Agora vamos fazer algumas seleções com a mesma lógica feita com a matriz do exemplo anterior.

# Selecionando as linhas de 1 a 3 e todas as colunas
df_iris[1:3,]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
# encontrar linhas onde Species=="setosa"
iris[iris$Species=="setosa",]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa
11          5.4         3.7          1.5         0.2  setosa
12          4.8         3.4          1.6         0.2  setosa
13          4.8         3.0          1.4         0.1  setosa
14          4.3         3.0          1.1         0.1  setosa
15          5.8         4.0          1.2         0.2  setosa
16          5.7         4.4          1.5         0.4  setosa
17          5.4         3.9          1.3         0.4  setosa
18          5.1         3.5          1.4         0.3  setosa
19          5.7         3.8          1.7         0.3  setosa
20          5.1         3.8          1.5         0.3  setosa
21          5.4         3.4          1.7         0.2  setosa
22          5.1         3.7          1.5         0.4  setosa
23          4.6         3.6          1.0         0.2  setosa
24          5.1         3.3          1.7         0.5  setosa
25          4.8         3.4          1.9         0.2  setosa
26          5.0         3.0          1.6         0.2  setosa
27          5.0         3.4          1.6         0.4  setosa
28          5.2         3.5          1.5         0.2  setosa
29          5.2         3.4          1.4         0.2  setosa
30          4.7         3.2          1.6         0.2  setosa
31          4.8         3.1          1.6         0.2  setosa
32          5.4         3.4          1.5         0.4  setosa
33          5.2         4.1          1.5         0.1  setosa
34          5.5         4.2          1.4         0.2  setosa
35          4.9         3.1          1.5         0.2  setosa
36          5.0         3.2          1.2         0.2  setosa
37          5.5         3.5          1.3         0.2  setosa
38          4.9         3.6          1.4         0.1  setosa
39          4.4         3.0          1.3         0.2  setosa
40          5.1         3.4          1.5         0.2  setosa
41          5.0         3.5          1.3         0.3  setosa
42          4.5         2.3          1.3         0.3  setosa
43          4.4         3.2          1.3         0.2  setosa
44          5.0         3.5          1.6         0.6  setosa
45          5.1         3.8          1.9         0.4  setosa
46          4.8         3.0          1.4         0.3  setosa
47          5.1         3.8          1.6         0.2  setosa
48          4.6         3.2          1.4         0.2  setosa
49          5.3         3.7          1.5         0.2  setosa
50          5.0         3.3          1.4         0.2  setosa
# encontrar linhas onde Species=="setosa" e Sepal.Length==5
iris[iris$Species=="setosa" & iris$Sepal.Length==5,]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5             5         3.6          1.4         0.2  setosa
8             5         3.4          1.5         0.2  setosa
26            5         3.0          1.6         0.2  setosa
27            5         3.4          1.6         0.4  setosa
36            5         3.2          1.2         0.2  setosa
41            5         3.5          1.3         0.3  setosa
44            5         3.5          1.6         0.6  setosa
50            5         3.3          1.4         0.2  setosa
2.5.0.1 Agrupando os dados
# agrupando os dados apenas pelas variáveis Species, Petal.Width e Petal.Length

iris[, c("Species", "Petal.Width", "Petal.Length")]
       Species Petal.Width Petal.Length
1       setosa         0.2          1.4
2       setosa         0.2          1.4
3       setosa         0.2          1.3
4       setosa         0.2          1.5
5       setosa         0.2          1.4
6       setosa         0.4          1.7
7       setosa         0.3          1.4
8       setosa         0.2          1.5
9       setosa         0.2          1.4
10      setosa         0.1          1.5
11      setosa         0.2          1.5
12      setosa         0.2          1.6
13      setosa         0.1          1.4
14      setosa         0.1          1.1
15      setosa         0.2          1.2
16      setosa         0.4          1.5
17      setosa         0.4          1.3
18      setosa         0.3          1.4
19      setosa         0.3          1.7
20      setosa         0.3          1.5
21      setosa         0.2          1.7
22      setosa         0.4          1.5
23      setosa         0.2          1.0
24      setosa         0.5          1.7
25      setosa         0.2          1.9
26      setosa         0.2          1.6
27      setosa         0.4          1.6
28      setosa         0.2          1.5
29      setosa         0.2          1.4
30      setosa         0.2          1.6
31      setosa         0.2          1.6
32      setosa         0.4          1.5
33      setosa         0.1          1.5
34      setosa         0.2          1.4
35      setosa         0.2          1.5
36      setosa         0.2          1.2
37      setosa         0.2          1.3
38      setosa         0.1          1.4
39      setosa         0.2          1.3
40      setosa         0.2          1.5
41      setosa         0.3          1.3
42      setosa         0.3          1.3
43      setosa         0.2          1.3
44      setosa         0.6          1.6
45      setosa         0.4          1.9
46      setosa         0.3          1.4
47      setosa         0.2          1.6
48      setosa         0.2          1.4
49      setosa         0.2          1.5
50      setosa         0.2          1.4
51  versicolor         1.4          4.7
52  versicolor         1.5          4.5
53  versicolor         1.5          4.9
54  versicolor         1.3          4.0
55  versicolor         1.5          4.6
56  versicolor         1.3          4.5
57  versicolor         1.6          4.7
58  versicolor         1.0          3.3
59  versicolor         1.3          4.6
60  versicolor         1.4          3.9
61  versicolor         1.0          3.5
62  versicolor         1.5          4.2
63  versicolor         1.0          4.0
64  versicolor         1.4          4.7
65  versicolor         1.3          3.6
66  versicolor         1.4          4.4
67  versicolor         1.5          4.5
68  versicolor         1.0          4.1
69  versicolor         1.5          4.5
70  versicolor         1.1          3.9
71  versicolor         1.8          4.8
72  versicolor         1.3          4.0
73  versicolor         1.5          4.9
74  versicolor         1.2          4.7
75  versicolor         1.3          4.3
76  versicolor         1.4          4.4
77  versicolor         1.4          4.8
78  versicolor         1.7          5.0
79  versicolor         1.5          4.5
80  versicolor         1.0          3.5
81  versicolor         1.1          3.8
82  versicolor         1.0          3.7
83  versicolor         1.2          3.9
84  versicolor         1.6          5.1
85  versicolor         1.5          4.5
86  versicolor         1.6          4.5
87  versicolor         1.5          4.7
88  versicolor         1.3          4.4
89  versicolor         1.3          4.1
90  versicolor         1.3          4.0
91  versicolor         1.2          4.4
92  versicolor         1.4          4.6
93  versicolor         1.2          4.0
94  versicolor         1.0          3.3
95  versicolor         1.3          4.2
96  versicolor         1.2          4.2
97  versicolor         1.3          4.2
98  versicolor         1.3          4.3
99  versicolor         1.1          3.0
100 versicolor         1.3          4.1
101  virginica         2.5          6.0
102  virginica         1.9          5.1
103  virginica         2.1          5.9
104  virginica         1.8          5.6
105  virginica         2.2          5.8
106  virginica         2.1          6.6
107  virginica         1.7          4.5
108  virginica         1.8          6.3
109  virginica         1.8          5.8
110  virginica         2.5          6.1
111  virginica         2.0          5.1
112  virginica         1.9          5.3
113  virginica         2.1          5.5
114  virginica         2.0          5.0
115  virginica         2.4          5.1
116  virginica         2.3          5.3
117  virginica         1.8          5.5
118  virginica         2.2          6.7
119  virginica         2.3          6.9
120  virginica         1.5          5.0
121  virginica         2.3          5.7
122  virginica         2.0          4.9
123  virginica         2.0          6.7
124  virginica         1.8          4.9
125  virginica         2.1          5.7
126  virginica         1.8          6.0
127  virginica         1.8          4.8
128  virginica         1.8          4.9
129  virginica         2.1          5.6
130  virginica         1.6          5.8
131  virginica         1.9          6.1
132  virginica         2.0          6.4
133  virginica         2.2          5.6
134  virginica         1.5          5.1
135  virginica         1.4          5.6
136  virginica         2.3          6.1
137  virginica         2.4          5.6
138  virginica         1.8          5.5
139  virginica         1.8          4.8
140  virginica         2.1          5.4
141  virginica         2.4          5.6
142  virginica         2.3          5.1
143  virginica         1.9          5.1
144  virginica         2.3          5.9
145  virginica         2.5          5.7
146  virginica         2.3          5.2
147  virginica         1.9          5.0
148  virginica         2.0          5.2
149  virginica         2.3          5.4
150  virginica         1.8          5.1
# Número de observações por Species
table(iris$Species)

    setosa versicolor  virginica 
        50         50         50 
# mesmo resultado anterior, mas no formato de um dataframe
data.frame(table(iris$Species))
        Var1 Freq
1     setosa   50
2 versicolor   50
3  virginica   50

2.5.1 Agrupando os dados por medidas descritivas

### Calculando a méda de Sepal.Length
mean(iris$Sepal.Length)
[1] 5.843333
# Calculando a média de Sepal.Length por Species
aggregate(Sepal.Length ~ Species, iris, mean)
     Species Sepal.Length
1     setosa        5.006
2 versicolor        5.936
3  virginica        6.588
# calculando a média Sepal.Length por Species onde Sepal.Width >= 3
aggregate(Sepal.Length ~ Species, iris[iris$Sepal.Width>=3,],mean)
     Species Sepal.Length
1     setosa     5.029167
2 versicolor     6.218750
3  virginica     6.768966

2.5.2 Medidas descritivas de uma variável

As medidas de tendência central e de dispersão são facilmente encontradas a partir de funções simples do R base.

# Média aritmética
mean(iris$Sepal.Length)
[1] 5.843333
# Mediana
median(iris$Sepal.Length)
[1] 5.8
# Variância
mean(iris$Sepal.Length)
[1] 5.843333
# Desvio padrão
sd(iris$Sepal.Length)
[1] 0.8280661

Com a função summary temos um resumo com as principais medidas descritivas de uma variável ou até mesmo de todo banco de dados.

summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       Species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

3 Pacote gtsummary

install.packages(): instala o pacote

library(): carrega o pacote

3.1 Tabelas

Vamos usar o banco de dados trial do pacote gtsummary.

library(gtsummary)
Warning: pacote 'gtsummary' foi compilado no R versão 4.4.3
head(trial)
# A tibble: 6 × 8
  trt      age marker stage grade response death ttdeath
  <chr>  <dbl>  <dbl> <fct> <fct>    <int> <int>   <dbl>
1 Drug A    23  0.16  T1    II           0     0    24  
2 Drug B     9  1.11  T2    I            1     0    24  
3 Drug A    31  0.277 T1    II           0     0    24  
4 Drug A    NA  2.07  T3    III          1     1    17.6
5 Drug A    51  2.77  T4    III          1     1    16.4
6 Drug B    39  0.613 T4    I            0     1    15.6
tbl_summary(trial)
Characteristic N = 2001
Chemotherapy Treatment
    Drug A 98 (49%)
    Drug B 102 (51%)
Age 47 (38, 57)
    Unknown 11
Marker Level (ng/mL) 0.64 (0.22, 1.41)
    Unknown 10
T Stage
    T1 53 (27%)
    T2 54 (27%)
    T3 43 (22%)
    T4 50 (25%)
Grade
    I 68 (34%)
    II 68 (34%)
    III 64 (32%)
Tumor Response 61 (32%)
    Unknown 7
Patient Died 112 (56%)
Months to Death/Censor 22.4 (15.9, 24.0)
1 n (%); Median (Q1, Q3)

3.2 Selecionando apenas uma variável

tab.trt = trial %>% 
          select(trt) %>% 
          tbl_summary()

tab.trt
Characteristic N = 2001
Chemotherapy Treatment
    Drug A 98 (49%)
    Drug B 102 (51%)
1 n (%)

3.3 Labels

tab.trt = trial %>% 
          select(trt) %>% 
          tbl_summary(label = trt ~ "Tratamento")

tab.trt
Characteristic N = 2001
Tratamento
    Drug A 98 (49%)
    Drug B 102 (51%)
1 n (%)

3.4 Descritivas

tab.age.stage = trial %>% 
                select(age,marker) %>% 
                tbl_summary(label = list(age ~ "Idade",
                                         marker ~ "Marcador"),
                            statistic = list(age ~ "{mean} ({sd})",
                                             marker ~ "{min} - {max}"))
tab.age.stage                
Characteristic N = 2001
Idade 47 (14)
    Unknown 11
Marcador 0.00 - 3.87
    Unknown 10
1 Mean (SD); Min - Max

3.5 Dados ausentes NA

tab.age.stage = trial %>% 
                select(age,marker) %>% 
                tbl_summary(label = list(age ~ "Idade",
                                         marker ~ "Marcador"),
                            statistic = list(age ~ "{mean} ({sd})",
                                             marker ~ "{min} - {max}"),
                            missing = "ifany",
                            missing_text = "Dados ausentes")

tab.age.stage                
Characteristic N = 2001
Idade 47 (14)
    Dados ausentes 11
Marcador 0.00 - 3.87
    Dados ausentes 10
1 Mean (SD); Min - Max

3.6 Labels em negrito

tab.age.stage = trial %>% 
                select(age,marker) %>% 
                tbl_summary(label = list(age ~ "Idade",
                                         marker ~ "Marcador"),
                            statistic = list(age ~ "{mean} ({sd})",
                                             marker ~ "{min} - {max}"),
                            missing = "ifany",
                            missing_text = "Dados ausentes") %>% 
            bold_labels()

tab.age.stage                
Characteristic N = 2001
Idade 47 (14)
    Dados ausentes 11
Marcador 0.00 - 3.87
    Dados ausentes 10
1 Mean (SD); Min - Max

3.7 Temas

# theme_gtsummary_journal() # ecolhas temas como "jama", "lancet", "nejm" e "qjecon"

# reset_gtsummary_theme() # reseta o tema para o padrão

# Definindo seu tema com português Brasil
# theme_gtsummary_language(
#   language = "pt",
#   decimal.mark = ",",
#   big.mark = ".",
#   iqr.sep = "-",
#   ci.sep = "-",
#   set_theme = TRUE
# )

4 Pacote flextable

library(flextable)
Warning: pacote 'flextable' foi compilado no R versão 4.4.3

Anexando pacote: 'flextable'
O seguinte objeto é mascarado por 'package:gtsummary':

    continuous_summary
tab = as_flex_table(tab.age.stage)
save_as_docx(tab, path = "C:/Users/denni/OneDrive/Documentos/UFPA 2025.2/MC1_2025/tabela.docx")

save_as_pptx(tab, path = "C:/Users/denni/OneDrive/Documentos/UFPA 2025.2/MC1_2025/tabela.pptx")