Apresenata a informação em duas dimensões. No R elas podem ser criadas de diversas formas, abaixo são apresentadas algumas formas de criar matrizes.
x <- c(2,4,6,8)
y <- c(7,9,11,13)
# Forma 01
forma1 <- cbind(x,y)
forma1
## x y
## [1,] 2 7
## [2,] 4 9
## [3,] 6 11
## [4,] 8 13
# Forma 02
forma2 <- rbind(x,y)
forma2
## [,1] [,2] [,3] [,4]
## x 2 4 6 8
## y 7 9 11 13
# Forma 03
forma3 <- matrix(x)
forma3
## [,1]
## [1,] 2
## [2,] 4
## [3,] 6
## [4,] 8
# forma 04
dim(x) <- c(2,2)
# ...
Operações com matrizes numéricas segue a mesma forma que vetores. A operação realizada com uma constante é feita com todos os elementos da matriz
## [,1] [,2]
## [1,] 20 60
## [2,] 40 80
## [1] 5
## [1] 2.581989
## [1] 20
Algumas funções específicas de matriz
t(x) # retorna a matriz transposta
## [,1] [,2]
## [1,] 2 4
## [2,] 6 8
det(x) # calcula a determinante de x
## [1] -8
diag(x) # retorna os elementos da diagonal principal
## [1] 2 8
dim(x) # retorna a dimensão da matriz
## [1] 2 2
ncol(x) # número de colunas
## [1] 2
nrow(x) # número de linhas
## [1] 2
rowSums(x) # soma das linhas da matriz
## [1] 8 12
rowMeans(x) # média das linhas da matriz
## [1] 4 6
colSums(x) # soma das colunas da matriz
## [1] 6 14
colMeans(x) # média das colunas da matriz
## [1] 3 7
Para uma visualização mais organizada de leitura dos dados de uma matriz é necessário que ela contenha o nome das linhas e o nome das colunas.
notas <- matrix(c(3,5,6,7,8,9,10,10,7,8,7,6,6,5,4,7), ncol = 4)
notas
## [,1] [,2] [,3] [,4]
## [1,] 3 8 7 6
## [2,] 5 9 8 5
## [3,] 6 10 7 4
## [4,] 7 10 6 7
rownames(notas) <- c("Rebeca", "Bruno", "João", "Carol") # nomeia linhas
colnames(notas) <- c("bim-1", "bim-2", "bim-3", "bim-4") # nomeia colunas
notas
## bim-1 bim-2 bim-3 bim-4
## Rebeca 3 8 7 6
## Bruno 5 9 8 5
## João 6 10 7 4
## Carol 7 10 6 7
notas["Rebeca", ]
## bim-1 bim-2 bim-3 bim-4
## 3 8 7 6
A união pode ocorrer por duas formas: linhas e colunas.
# Criando uma nova matriz
alunos_trans <- matrix(c(8,6,9,10,4,7,8,9), nrow = 2, ncol = 4, byrow = TRUE)
alunos_trans
## [,1] [,2] [,3] [,4]
## [1,] 8 6 9 10
## [2,] 4 7 8 9
rownames(alunos_trans) <- c("Adriano", "Mariana")
colnames(alunos_trans) <- c("bim-1", "bim-2", "bim-3", "bim-4")
alunos_trans
## bim-1 bim-2 bim-3 bim-4
## Adriano 8 6 9 10
## Mariana 4 7 8 9
# Unindo matrizes por linhas
rbind(notas, alunos_trans)
## bim-1 bim-2 bim-3 bim-4
## Rebeca 3 8 7 6
## Bruno 5 9 8 5
## João 6 10 7 4
## Carol 7 10 6 7
## Adriano 8 6 9 10
## Mariana 4 7 8 9
# Criando uma nova matriz
recup <- matrix(c(0,0,0,0), nrow = 4)
# Unindo matrizes por colunas
novo.res <- cbind(notas, recup)
colnames(novo.res) <- c("bim-1", "bim-2", "bim-3", "bim-4", "recup")
novo.res
## bim-1 bim-2 bim-3 bim-4 recup
## Rebeca 3 8 7 6 0
## Bruno 5 9 8 5 0
## João 6 10 7 4 0
## Carol 7 10 6 7 0
Dataframes são tabelas de dados em que cada coluna pode armazenar diferentes tipos de dados.
alunos <- data.frame(
nome = c("Maria", "Rebeca", "Gabriela", "Roberto", "Mateus", "Gustavo", "Tatiane", "Isaque"),
sexo = c("feminino", "feminino", "feminino", "masculino", "masculino", "masculino", "feminino", "masculino"),
graduacao = c("Farmácia", "Farmácia", "Nutrição", "Química", "Física", "Química", "Biotecnologia", "Biotecnologia"),
fumante = c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
altura = c(1.65, 1.7, 1.65, 1.80, 1.73, 1.75, 1.68, 1.71),
idade = c(18, 19, 23, 22, 20, 19, 25, 26),
peso = c(50, 65, 52, 70, 75, 63, 62, 70),
renda = c(2, 3, 1, 2, 2, 4, 4, NA)
)
alunos
## nome sexo graduacao fumante altura idade peso renda
## 1 Maria feminino Farmácia TRUE 1.65 18 50 2
## 2 Rebeca feminino Farmácia TRUE 1.70 19 65 3
## 3 Gabriela feminino Nutrição FALSE 1.65 23 52 1
## 4 Roberto masculino Química TRUE 1.80 22 70 2
## 5 Mateus masculino Física FALSE 1.73 20 75 2
## 6 Gustavo masculino Química FALSE 1.75 19 63 4
## 7 Tatiane feminino Biotecnologia FALSE 1.68 25 62 4
## 8 Isaque masculino Biotecnologia TRUE 1.71 26 70 NA
A função str() nos dá uma visão da estrutura do nosso objeto
str(alunos)
## 'data.frame': 8 obs. of 8 variables:
## $ nome : Factor w/ 8 levels "Gabriela","Gustavo",..: 4 6 1 7 5 2 8 3
## $ sexo : Factor w/ 2 levels "feminino","masculino": 1 1 1 2 2 2 1 2
## $ graduacao: Factor w/ 5 levels "Biotecnologia",..: 2 2 4 5 3 5 1 1
## $ fumante : logi TRUE TRUE FALSE TRUE FALSE FALSE ...
## $ altura : num 1.65 1.7 1.65 1.8 1.73 1.75 1.68 1.71
## $ idade : num 18 19 23 22 20 19 25 26
## $ peso : num 50 65 52 70 75 63 62 70
## $ renda : num 2 3 1 2 2 4 4 NA
# quatro variáveis numéricas
# três variáveis fatores
# uma variável lógica
Em alguns pontos a manipulação de dados em dataframes é parecida com matrizes. Seleção de elementos é da mesma forma
alunos[2,5] # seleciona o elemento da segunda linha sendo da quinta coluna
## [1] 1.7
alunos[ , c("nome", "sexo", "graduacao")] # seleciona todas as linhas, porém, somente as variáveis: nome, sexo e graduacao
## nome sexo graduacao
## 1 Maria feminino Farmácia
## 2 Rebeca feminino Farmácia
## 3 Gabriela feminino Nutrição
## 4 Roberto masculino Química
## 5 Mateus masculino Física
## 6 Gustavo masculino Química
## 7 Tatiane feminino Biotecnologia
## 8 Isaque masculino Biotecnologia
alunos[1:3, ] # seleciona as três primeiras linhas e todas as variáveis
## nome sexo graduacao fumante altura idade peso renda
## 1 Maria feminino Farmácia TRUE 1.65 18 50 2
## 2 Rebeca feminino Farmácia TRUE 1.70 19 65 3
## 3 Gabriela feminino Nutrição FALSE 1.65 23 52 1
alunos[c(1, 8), ] # seleciona a primeira linha e a oitava linha junto com todas as variáveis
## nome sexo graduacao fumante altura idade peso renda
## 1 Maria feminino Farmácia TRUE 1.65 18 50 2
## 8 Isaque masculino Biotecnologia TRUE 1.71 26 70 NA
Para selecionar variáveis no dataframe devemos fazer da seguinte forma: dataframe_que_você_está_a_variável$_nome_da_variável
alunos$nome
## [1] Maria Rebeca Gabriela Roberto Mateus Gustavo Tatiane Isaque
## Levels: Gabriela Gustavo Isaque Maria Mateus Rebeca Roberto Tatiane
alunos$graduacao
## [1] Farmácia Farmácia Nutrição Química Física
## [6] Química Biotecnologia Biotecnologia
## Levels: Biotecnologia Farmácia Física Nutrição Química
alunos$nome[2]
## [1] Rebeca
## Levels: Gabriela Gustavo Isaque Maria Mateus Rebeca Roberto Tatiane
A função subset() nos permite selecionar dados conforme vários critérios e de forma mais intuitiva
# Se quisermos selecionar apenas os dados de alunos com peso igual ou superior a 70
subset(alunos, peso >= 65)
## nome sexo graduacao fumante altura idade peso renda
## 2 Rebeca feminino Farmácia TRUE 1.70 19 65 3
## 4 Roberto masculino Química TRUE 1.80 22 70 2
## 5 Mateus masculino Física FALSE 1.73 20 75 2
## 8 Isaque masculino Biotecnologia TRUE 1.71 26 70 NA
# Se quisermos selecionar apenas os dados de alunos com altura superior a 1.70 e com idade superior a 20
subset(alunos, altura > 1.70 & idade > 20)
## nome sexo graduacao fumante altura idade peso renda
## 4 Roberto masculino Química TRUE 1.80 22 70 2
## 8 Isaque masculino Biotecnologia TRUE 1.71 26 70 NA
# Se quisermos selecionar os dados de alunos que fazem o curso de "Química" ou idade inferior a 20
subset(alunos, graduacao == "Química" | idade < 20)
## nome sexo graduacao fumante altura idade peso renda
## 1 Maria feminino Farmácia TRUE 1.65 18 50 2
## 2 Rebeca feminino Farmácia TRUE 1.70 19 65 3
## 4 Roberto masculino Química TRUE 1.80 22 70 2
## 6 Gustavo masculino Química FALSE 1.75 19 63 4
Vamos aplicar a função summary() no nosso dataframe, ela irá retornar um resumo das variáveis do nosso dataframe
# Aplicando para todo o dataframe
summary(alunos)
## nome sexo graduacao fumante
## Gabriela:1 feminino :4 Biotecnologia:2 Mode :logical
## Gustavo :1 masculino:4 Farmácia :2 FALSE:4
## Isaque :1 Física :1 TRUE :4
## Maria :1 Nutrição :1
## Mateus :1 Química :2
## Rebeca :1
## (Other) :2
## altura idade peso renda
## Min. :1.650 Min. :18.0 Min. :50.00 Min. :1.000
## 1st Qu.:1.673 1st Qu.:19.0 1st Qu.:59.50 1st Qu.:2.000
## Median :1.705 Median :21.0 Median :64.00 Median :2.000
## Mean :1.709 Mean :21.5 Mean :63.38 Mean :2.571
## 3rd Qu.:1.735 3rd Qu.:23.5 3rd Qu.:70.00 3rd Qu.:3.500
## Max. :1.800 Max. :26.0 Max. :75.00 Max. :4.000
## NA's :1
# Aplicando summary com a condição de altura ser maior que 1.70
summary(subset(alunos, altura > 1.70))
## nome sexo graduacao fumante
## Gustavo :1 feminino :0 Biotecnologia:1 Mode :logical
## Isaque :1 masculino:4 Farmácia :0 FALSE:2
## Mateus :1 Física :1 TRUE :2
## Roberto :1 Nutrição :0
## Gabriela:0 Química :2
## Maria :0
## (Other) :0
## altura idade peso renda
## Min. :1.710 Min. :19.00 Min. :63.00 Min. :2.000
## 1st Qu.:1.725 1st Qu.:19.75 1st Qu.:68.25 1st Qu.:2.000
## Median :1.740 Median :21.00 Median :70.00 Median :2.000
## Mean :1.748 Mean :21.75 Mean :69.50 Mean :2.667
## 3rd Qu.:1.762 3rd Qu.:23.00 3rd Qu.:71.25 3rd Qu.:3.000
## Max. :1.800 Max. :26.00 Max. :75.00 Max. :4.000
## NA's :1
# Aplicando summary para os alunos que são do sexo feminino
summary(subset(alunos, sexo == "feminino"))
## nome sexo graduacao fumante
## Gabriela:1 feminino :4 Biotecnologia:1 Mode :logical
## Maria :1 masculino:0 Farmácia :2 FALSE:2
## Rebeca :1 Física :0 TRUE :2
## Tatiane :1 Nutrição :1
## Gustavo :0 Química :0
## Isaque :0
## (Other) :0
## altura idade peso renda
## Min. :1.650 Min. :18.00 Min. :50.00 Min. :1.00
## 1st Qu.:1.650 1st Qu.:18.75 1st Qu.:51.50 1st Qu.:1.75
## Median :1.665 Median :21.00 Median :57.00 Median :2.50
## Mean :1.670 Mean :21.25 Mean :57.25 Mean :2.50
## 3rd Qu.:1.685 3rd Qu.:23.50 3rd Qu.:62.75 3rd Qu.:3.25
## Max. :1.700 Max. :25.00 Max. :65.00 Max. :4.00
##
# Escolhendo as variáveis
summary(subset(alunos, select = c(altura, idade, peso, renda)))
## altura idade peso renda
## Min. :1.650 Min. :18.0 Min. :50.00 Min. :1.000
## 1st Qu.:1.673 1st Qu.:19.0 1st Qu.:59.50 1st Qu.:2.000
## Median :1.705 Median :21.0 Median :64.00 Median :2.000
## Mean :1.709 Mean :21.5 Mean :63.38 Mean :2.571
## 3rd Qu.:1.735 3rd Qu.:23.5 3rd Qu.:70.00 3rd Qu.:3.500
## Max. :1.800 Max. :26.0 Max. :75.00 Max. :4.000
## NA's :1
Outras funções utilizadas em matrizes que também funcionam em dataframe
ncol(alunos)
## [1] 8
nrow(alunos)
## [1] 8
dim(alunos)
## [1] 8 8
t(alunos)
## [,1] [,2] [,3] [,4] [,5]
## nome "Maria" "Rebeca" "Gabriela" "Roberto" "Mateus"
## sexo "feminino" "feminino" "feminino" "masculino" "masculino"
## graduacao "Farmácia" "Farmácia" "Nutrição" "Química" "Física"
## fumante " TRUE" " TRUE" "FALSE" " TRUE" "FALSE"
## altura "1.65" "1.70" "1.65" "1.80" "1.73"
## idade "18" "19" "23" "22" "20"
## peso "50" "65" "52" "70" "75"
## renda " 2" " 3" " 1" " 2" " 2"
## [,6] [,7] [,8]
## nome "Gustavo" "Tatiane" "Isaque"
## sexo "masculino" "feminino" "masculino"
## graduacao "Química" "Biotecnologia" "Biotecnologia"
## fumante "FALSE" "FALSE" " TRUE"
## altura "1.75" "1.68" "1.71"
## idade "19" "25" "26"
## peso "63" "62" "70"
## renda " 4" " 4" NA
colnames(alunos)
## [1] "nome" "sexo" "graduacao" "fumante" "altura" "idade"
## [7] "peso" "renda"
Algumas funções legais para conhecer seu dataframe é head() e tail()
head(alunos) # retorna as seis primeiras colunas
## nome sexo graduacao fumante altura idade peso renda
## 1 Maria feminino Farmácia TRUE 1.65 18 50 2
## 2 Rebeca feminino Farmácia TRUE 1.70 19 65 3
## 3 Gabriela feminino Nutrição FALSE 1.65 23 52 1
## 4 Roberto masculino Química TRUE 1.80 22 70 2
## 5 Mateus masculino Física FALSE 1.73 20 75 2
## 6 Gustavo masculino Química FALSE 1.75 19 63 4
tail(alunos) # retorna as seis últimas colunas
## nome sexo graduacao fumante altura idade peso renda
## 3 Gabriela feminino Nutrição FALSE 1.65 23 52 1
## 4 Roberto masculino Química TRUE 1.80 22 70 2
## 5 Mateus masculino Física FALSE 1.73 20 75 2
## 6 Gustavo masculino Química FALSE 1.75 19 63 4
## 7 Tatiane feminino Biotecnologia FALSE 1.68 25 62 4
## 8 Isaque masculino Biotecnologia TRUE 1.71 26 70 NA
Vamos criar uma nova coluna chamada situação atribuindo valores ativos.
alunos$situacao <- c("ativo")
Transformar variáveis é parecido com criar novas variáveis. Em nosso objeto, a variáevl altura está em metros, vamos tranformá-la em centímetros (cm). Sabendo que 1 metro = 100 centímetros vamos tranformar a nossa variável.
alunos$altura <- alunos$altura * 100
head(alunos)
## nome sexo graduacao fumante altura idade peso renda situacao
## 1 Maria feminino Farmácia TRUE 165 18 50 2 ativo
## 2 Rebeca feminino Farmácia TRUE 170 19 65 3 ativo
## 3 Gabriela feminino Nutrição FALSE 165 23 52 1 ativo
## 4 Roberto masculino Química TRUE 180 22 70 2 ativo
## 5 Mateus masculino Física FALSE 173 20 75 2 ativo
## 6 Gustavo masculino Química FALSE 175 19 63 4 ativo
Diversas vezes precisamos converter um tipo de uma determinada variável, para isso, podemos utlizar as seguintes funções: as.Date() - converte um objeto do tipo character para um objeto do tipo Date as.numeric() - cria um objeto do tipo numeric as.character() - cria um objeto do tipo character as.factor() - cria um objeto do tipo factor
Quando criamos nosso dataframe “alunos”, repare que o que não é do tipo numérico ou lógico é do tipo factor, isso se deve porque o default da função data.framecontém o argumento stringsAsFactors = TRUE assim todos os dados no formato de texto será convertido em fator. Podemos colocar o argumento stringsAsFactors = FALSE para criar os dados do formato texto em tipo caracter.
alunos <- data.frame(
nome = c("Maria", "Rebeca", "Gabriela", "Roberto", "Mateus", "Gustavo", "Tatiane", "Isaque"),
sexo = c("feminino", "feminino", "feminino", "masculino", "masculino", "masculino", "feminino", "masculino"),
graduacao = c("Farmácia", "Farmácia", "Nutrição", "Química", "Física", "Química", "Biotecnologia", "Biotecnologia"),
fumante = c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
altura = c(1.65, 1.7, 1.65, 1.80, 1.73, 1.75, 1.68, 1.71),
idade = c(18, 19, 23, 22, 20, 19, 25, 26),
peso = c(50, 65, 52, 70, 75, 63, 62, 70),
renda = c(2, 3, 1, 2, 2, 4, 4, NA),
stringsAsFactors = FALSE
)
str(alunos) # visualizar o tipo das variáveis
## 'data.frame': 8 obs. of 8 variables:
## $ nome : chr "Maria" "Rebeca" "Gabriela" "Roberto" ...
## $ sexo : chr "feminino" "feminino" "feminino" "masculino" ...
## $ graduacao: chr "Farmácia" "Farmácia" "Nutrição" "Química" ...
## $ fumante : logi TRUE TRUE FALSE TRUE FALSE FALSE ...
## $ altura : num 1.65 1.7 1.65 1.8 1.73 1.75 1.68 1.71
## $ idade : num 18 19 23 22 20 19 25 26
## $ peso : num 50 65 52 70 75 63 62 70
## $ renda : num 2 3 1 2 2 4 4 NA
class(alunos$nome) # visualiza o tipo da variável nome
## [1] "character"
Tibble é parecida com dataframes, porém na impressão do dataframe vai ser apresentado as dez primeiras linhas e também os tipos de cada variável, ou seja, um método de impressão mais adequado. Precisamos do pacote tibble para acessar as tibles, assim, vamos baixar o pacote e carregá-lo.
# Instalando o pacote
install.packages("tibble")
## Installing package into '/home/jean/R/x86_64-pc-linux-gnu-library/3.5'
## (as 'lib' is unspecified)
# Carregando o pacote
library(tibble)
# Criando uma Tibble
tibble(
nomes = c("Ivan", "Gabriela", "Bruno"),
idade = c(20,18,22),
fumante = c(TRUE, FALSE, TRUE)
)
## # A tibble: 3 x 3
## nomes idade fumante
## <chr> <dbl> <lgl>
## 1 Ivan 20 TRUE
## 2 Gabriela 18 FALSE
## 3 Bruno 22 TRUE