Aula 2 – Vetores, Matrizes, Dataframes e Listas

Autor

Prof. Marcelo Ribeiro

Objetivo da Aula

Compreender e aplicar as principais estruturas de armazenamento de dados no R: vetores, matrizes, dataframes e listas.

1. Revisão: objetos no R

Na aula anterior, vimos que o R permite criar objetos para armazenar informações.

Comentário do professor

A partir deste momento, deixamos de usar o R apenas como uma calculadora simples e começamos a organizar informações em estruturas de dados.

Execute o código abaixo
peso <- 75
altura <- 1.70

peso
[1] 75
altura
[1] 1.7

2. Vetores

Vetores são estruturas que armazenam uma sequência de valores do mesmo tipo. Um vetor pode conter números, textos ou valores lógicos.

Comentário do professor

Vetores são uma das estruturas mais importantes do R. Muitas análises estatísticas começam com a criação ou manipulação de vetores.

2.1 Criando vetores

Execute este código
idades <- c(34, 45, 29)
nomes <- c("Ana", "João", "Fernanda")
respondeu <- c(TRUE, FALSE, TRUE)

idades
[1] 34 45 29
nomes
[1] "Ana"      "João"     "Fernanda"
respondeu
[1]  TRUE FALSE  TRUE
Atenção

Todos os elementos de um vetor devem ser do mesmo tipo. Quando tipos diferentes são misturados, o R faz coerção automática.

Execute este código
vetor_misto <- c(10, 20, "Ana")

vetor_misto
[1] "10"  "20"  "Ana"
class(vetor_misto)
[1] "character"

2.2 Sequências e repetições

Execute este código
sequencia_1 <- 1:10
sequencia_2 <- seq(0, 20, by = 2)

repeticao_1 <- rep(5, times = 8)
repeticao_2 <- rep(c(1, 2, 3), times = 3)

sequencia_1
 [1]  1  2  3  4  5  6  7  8  9 10
sequencia_2
 [1]  0  2  4  6  8 10 12 14 16 18 20
repeticao_1
[1] 5 5 5 5 5 5 5 5
repeticao_2
[1] 1 2 3 1 2 3 1 2 3

2.3 Operações com vetores

Comentário do professor

Quando realizamos operações matemáticas com vetores, o R aplica a operação elemento por elemento.

Execute este código
x <- c(10, 20, 30)
y <- c(1, 2, 3)

x + y
[1] 11 22 33
x - y
[1]  9 18 27
x * y
[1] 10 40 90
x / y
[1] 10 10 10
x^2
[1] 100 400 900

2.4 Produto escalar

O produto escalar multiplica os elementos correspondentes de dois vetores e soma os resultados.

Execute este código
a <- c(1, 2, 3)
b <- c(4, 5, 6)

a %*% b
     [,1]
[1,]   32
Comentário do professor

No exemplo anterior, o R calcula:

\(1 \cdot 4 + 2 \cdot 5 + 3 \cdot 6\)

2.5 Acessando posições de um vetor

No R, a primeira posição de um vetor é sempre a posição 1.

Execute este código
notas <- c(8.5, 7.0, 9.2, 6.8, 10)

notas[1]
[1] 8.5
notas[3]
[1] 9.2
notas[c(2, 4)]
[1] 7.0 6.8

2.6 Indexação lógica

Comentário do professor

A indexação lógica é uma das ferramentas mais úteis do R, pois permite selecionar valores a partir de condições.

Execute este código
notas <- c(8.5, 7.0, 9.2, 6.8, 10)

notas > 7
[1]  TRUE FALSE  TRUE FALSE  TRUE
notas[notas > 7]
[1]  8.5  9.2 10.0
notas[notas >= 9]
[1]  9.2 10.0

2.7 Funções úteis para vetores

Execute este código
notas <- c(8.5, 7.0, 9.2, 6.8, 10)

sum(notas)
[1] 41.5
mean(notas)
[1] 8.3
median(notas)
[1] 8.5
min(notas)
[1] 6.8
max(notas)
[1] 10
length(notas)
[1] 5
sort(notas)
[1]  6.8  7.0  8.5  9.2 10.0
rev(notas)
[1] 10.0  6.8  9.2  7.0  8.5
summary(notas)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    6.8     7.0     8.5     8.3     9.2    10.0 

2.8 Valores ausentes: NA

Atenção

O valor NA representa ausência de informação. Muitas funções precisam do argumento na.rm = TRUE para ignorar esses valores.

Execute este código
notas_com_na <- c(8.5, NA, 7.0, 9.2, NA, 10)

is.na(notas_com_na)
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE
notas_com_na[!is.na(notas_com_na)]
[1]  8.5  7.0  9.2 10.0
mean(notas_com_na, na.rm = TRUE)
[1] 8.675

3. Matrizes

Matrizes são estruturas bidimensionais, formadas por linhas e colunas.

Comentário do professor

Podemos pensar em uma matriz como uma tabela numérica. Diferentemente do dataframe, uma matriz deve armazenar dados do mesmo tipo.

3.1 Criando matrizes

Execute este código
matriz_1 <- matrix(1:9, ncol = 3)

matriz_1
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

Por padrão, o R preenche a matriz por colunas.

Execute este código
matriz_2 <- matrix(1:9, ncol = 3, byrow = TRUE)

matriz_2
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

3.2 Dimensão de uma matriz

Execute este código
nrow(matriz_2)
[1] 3
ncol(matriz_2)
[1] 3
dim(matriz_2)
[1] 3 3
length(matriz_2)
[1] 9

3.3 Acessando elementos de uma matriz

Comentário do professor

Para acessar elementos de uma matriz, usamos a estrutura [linha, coluna].

Execute este código
matriz_2
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
matriz_2[1, 1]
[1] 1
matriz_2[2, 3]
[1] 6
matriz_2[1, ]
[1] 1 2 3
matriz_2[, 2]
[1] 2 5 8

3.4 Alterando elementos de uma matriz

Execute este código
matriz_2[2, 2] <- 100

matriz_2
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4  100    6
[3,]    7    8    9

3.5 Operações com matrizes

Execute este código
A <- matrix(1:4, ncol = 2)
B <- matrix(c(2, 4, 6, 8), ncol = 2)

A
     [,1] [,2]
[1,]    1    3
[2,]    2    4
B
     [,1] [,2]
[1,]    2    6
[2,]    4    8
A + B
     [,1] [,2]
[1,]    3    9
[2,]    6   12
A - B
     [,1] [,2]
[1,]   -1   -3
[2,]   -2   -4
A * B
     [,1] [,2]
[1,]    2   18
[2,]    8   32
A %*% B
     [,1] [,2]
[1,]   14   30
[2,]   20   44
Atenção

O operador * faz multiplicação elemento a elemento.

O operador %*% faz multiplicação matricial.

3.6 Funções úteis para matrizes

Execute este código
M <- matrix(1:9, ncol = 3, byrow = TRUE)

M
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
t(M)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
diag(M)
[1] 1 5 9
rowSums(M)
[1]  6 15 24
colSums(M)
[1] 12 15 18
rowMeans(M)
[1] 2 5 8
colMeans(M)
[1] 4 5 6

4. Dataframes

Dataframes são estruturas em formato de tabela. Diferentemente das matrizes, cada coluna pode ter um tipo diferente.

Comentário do professor

O dataframe é uma das estruturas mais usadas em análise de dados, pois se parece com uma planilha.

4.1 Criando um dataframe

Execute este código
pacientes <- data.frame(
  nome = c("Ana", "João", "Fernanda"),
  idade = c(34, 45, 29),
  peso = c(68.5, 82.0, 59.3),
  altura = c(1.65, 1.78, 1.60),
  respondeu = c(TRUE, FALSE, TRUE)
)

pacientes

4.2 Estrutura do dataframe

Execute este código
str(pacientes)
'data.frame':   3 obs. of  5 variables:
 $ nome     : chr  "Ana" "João" "Fernanda"
 $ idade    : num  34 45 29
 $ peso     : num  68.5 82 59.3
 $ altura   : num  1.65 1.78 1.6
 $ respondeu: logi  TRUE FALSE TRUE
dim(pacientes)
[1] 3 5
nrow(pacientes)
[1] 3
ncol(pacientes)
[1] 5
names(pacientes)
[1] "nome"      "idade"     "peso"      "altura"    "respondeu"

4.3 Acessando colunas

Execute este código
pacientes$nome
[1] "Ana"      "João"     "Fernanda"
pacientes$idade
[1] 34 45 29
pacientes[, "peso"]
[1] 68.5 82.0 59.3

4.4 Acessando linhas e células

Execute este código
pacientes[1, ]
pacientes[2, ]
pacientes[1, "nome"]
[1] "Ana"
pacientes[3, "peso"]
[1] 59.3

4.5 Criando uma nova coluna

Comentário do professor

Como cada coluna de um dataframe pode ser tratada como um vetor, podemos criar novas variáveis a partir de cálculos.

Execute este código
pacientes$imc <- pacientes$peso / pacientes$altura^2

pacientes

4.6 Filtrando informações

Execute este código
pacientes[pacientes$idade > 30, ]
pacientes[pacientes$imc >= 25, ]
pacientes[pacientes$respondeu == TRUE, ]
Atenção

Em filtros lógicos, usamos == para comparação, e não =.

5. Listas

Listas são estruturas flexíveis que podem armazenar diferentes tipos de objetos.

Comentário do professor

Uma lista pode guardar vetores, matrizes, dataframes, textos, números e até outras listas.

5.1 Criando uma lista

Execute este código
minha_lista <- list(
  nomes = c("Ana", "João", "Fernanda"),
  notas = c(8.5, 7.0, 9.2),
  matriz = matrix(1:4, ncol = 2),
  dataframe = pacientes,
  texto = "Exemplo de lista no R"
)

minha_lista
$nomes
[1] "Ana"      "João"     "Fernanda"

$notas
[1] 8.5 7.0 9.2

$matriz
     [,1] [,2]
[1,]    1    3
[2,]    2    4

$dataframe
      nome idade peso altura respondeu      imc
1      Ana    34 68.5   1.65      TRUE 25.16070
2     João    45 82.0   1.78     FALSE 25.88057
3 Fernanda    29 59.3   1.60      TRUE 23.16406

$texto
[1] "Exemplo de lista no R"

5.2 Acessando elementos de uma lista

Execute este código
minha_lista$nomes
[1] "Ana"      "João"     "Fernanda"
minha_lista$notas
[1] 8.5 7.0 9.2
minha_lista$matriz
     [,1] [,2]
[1,]    1    3
[2,]    2    4
minha_lista[[1]]
[1] "Ana"      "João"     "Fernanda"
minha_lista[[4]]
Atenção

O operador $ acessa elementos pelo nome.

O operador [[ ]] acessa elementos pela posição.

5.3 Verificando a estrutura da lista

Execute este código
str(minha_lista)
List of 5
 $ nomes    : chr [1:3] "Ana" "João" "Fernanda"
 $ notas    : num [1:3] 8.5 7 9.2
 $ matriz   : int [1:2, 1:2] 1 2 3 4
 $ dataframe:'data.frame':  3 obs. of  6 variables:
  ..$ nome     : chr [1:3] "Ana" "João" "Fernanda"
  ..$ idade    : num [1:3] 34 45 29
  ..$ peso     : num [1:3] 68.5 82 59.3
  ..$ altura   : num [1:3] 1.65 1.78 1.6
  ..$ respondeu: logi [1:3] TRUE FALSE TRUE
  ..$ imc      : num [1:3] 25.2 25.9 23.2
 $ texto    : chr "Exemplo de lista no R"
length(minha_lista)
[1] 5
names(minha_lista)
[1] "nomes"     "notas"     "matriz"    "dataframe" "texto"    

6. Exercícios

Exercício 1 – Vetores

Crie um vetor com os números de 1 a 100 e selecione apenas os números pares.

numeros <- 1:100

numeros_pares <- numeros[numeros %% 2 == 0]

numeros_pares
 [1]   2   4   6   8  10  12  14  16  18  20  22  24  26  28  30  32  34  36  38
[20]  40  42  44  46  48  50  52  54  56  58  60  62  64  66  68  70  72  74  76
[39]  78  80  82  84  86  88  90  92  94  96  98 100
Exercício 2 – Valores ausentes

Considere o vetor abaixo e calcule a média ignorando os valores ausentes.

valores <- c(10, 20, NA, 40, NA, 50)

mean(valores, na.rm = TRUE)
[1] 30
Exercício 3 – Matrizes

Crie uma matriz 3x3 com os números de 1 a 9 e calcule sua transposta.

matriz_exercicio <- matrix(1:9, ncol = 3, byrow = TRUE)

matriz_exercicio
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
t(matriz_exercicio)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
Exercício 4 – Dataframes

Crie um dataframe com nome, idade e nota de quatro alunos. Depois filtre apenas os alunos com nota maior ou igual a 7.

alunos <- data.frame(
  nome = c("Maria", "Pedro", "Lucas", "Carla"),
  idade = c(20, 22, 19, 21),
  nota = c(8.5, 6.0, 7.2, 5.9)
)

alunos
alunos[alunos$nota >= 7, ]
Exercício 5 – Listas

Crie uma lista contendo o dataframe alunos, o vetor de notas e uma mensagem de texto.

lista_alunos <- list(
  dados = alunos,
  notas = alunos$nota,
  mensagem = "Lista criada com sucesso"
)

lista_alunos
$dados
   nome idade nota
1 Maria    20  8.5
2 Pedro    22  6.0
3 Lucas    19  7.2
4 Carla    21  5.9

$notas
[1] 8.5 6.0 7.2 5.9

$mensagem
[1] "Lista criada com sucesso"
Comentário do professor

Essas estruturas serão utilizadas em praticamente todas as próximas aulas. Por isso, é importante praticar a criação, o acesso e a manipulação desses objetos.