Matrizes

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

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

Nomeando linhas e colunas de uma matriz

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

Unindo matrizes

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

Dataframe

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

Manipulando dataframes

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

Criando e modificando variáveis

Vamos criar uma nova coluna chamada situação atribuindo valores ativos.

alunos$situacao <- c("ativo")

Transformando variáveis

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

Convertendo tipos de variáveis

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

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