3 Apresentação à linguagem R
O R é uma linguagem de programação amplamente utilizada para análise de dados, cálculo estatísticos e visualização de dados. Além disso, o R tem uma enorme coleção de pacotes que ampliam suas funcionalidades, usaremos alguns durante o nosso estudo. O RStudio é uma interface gráfica para a linguagem de programação R. Ele torna o R mais fácil de usar e fornece algumas funcionalidades úteis.
3.2 Comparação com outras linguagens estatísticas
Diferente de outras linguagens de programação, o R foi desenvolvido especificamente para a área de estatística, sendo usado na análise de dados e modelagem. Por isso, essa linguagem possui uma enorme quantidade de pacotes voltados para visualização e análise de dados (alguns exemplos são o ggplot2, dplyr, caret).
3.3 Introdução ao RMarkdown
Na disciplina de Análise Exploratória de Dados, usaremos somente o RMarkdown, uma ferramenta que nos permite escrever textos e executar códigos em R.
Para criar um arquivo em RMarrkdown clique em File > New File > R Markdown. Preencha as informações iniciais, como o título do documento e o autor e por fim escolha o tipo de saída, como PDF, HTML ou Word.
- Estrutura de um Arquivo RMarkdown
Um arquivo .Rmd tem a seguinte estrutura:
- Cabeçalho YAML, que define as configurações do documento.
- Texto formatado, que usa a sintaxe Markdown para formatação de texto, por exemplo:
- “# Título 1” para criar títulos de nível 1.
- Para destacar: ‘’Texto em itálico’’ ou ‘’Texto em negrito’’.
- Para criar listas não ordenadas (com marcadores): use - ou * antes dos itens. Já para listas ordenadas (numeradas): use números seguidos de ponto.
- Blocos de códigos (chunks), que são delimitados por três crases (```) e é onde você pode escrever e executar os comandos em R. Eles permitem integrar o código diretamente ao documento, gerando tabelas, gráficos, etc. Para cria-lo basta escrever as três crases Um atalho para cria-lo é com CTRL+ALT+I.
- Equações Matemáticas no RMarkdown:
É possível fazer equações matemáticas em R Markdown usando a sintaxe do LaTeX. Existem duas formas principais:
- Equações em linha: use cifrões simples
$...$
para inserir fórmulas no meio do texto. - Equações destacadas (em bloco): use dois cifrões
$$...$$
para centralizar a equação.
Para mais informações sobre o R Markdown, acesse a cheatsheet oficial diretamente pelo RStudio. Basta ir em Help > Cheatsheets > R Markdown Cheat Sheet. Lá você encontra um resumo com os principais comandos de formatação, código, tabelas, gráficos e equações.
3.4 Operadores Básicos
- Operadores de atribuição:
Em R usamos os operadores de atribuição para atribuir valores a variáveis. Para fazer isso podemos usar <-, -> e =.
## [1] 5
## [1] 10
## [1] 7
Mesmo sendo possível usar diferentes operadores de atribuição, o padrão costuma ser feito com <-. Para isso, podemos usar o atalho ALT+-.
- Operadores aritméticos:
Para realizar operações matemáticas básicas, usamos:
# Adição: "+"
resultado1 <- 7 + 3
# Subtração: "-"
resultado2 <- 50 - 5
# Multiplicação: "*"
resultado3 <- 6 * 7 # 42
# Divisão: "/"
resultado4 <- 17 / 3
# Exponenciação: "^" ou "**"
resultado5 <- 2 ^ 4
resultado6 <- 3 ** 2
# Resto da divisão: "%%"
resultado7 <- 10 %% 3
# Divisão inteira: "%/%"
resultado8 <- 10 %/% 3
- Operadores de comparação:
Usamos os operadores de comparação para comparar dois valores, sendo retorado um valor lógico: TRUE ou FALSE, dependendo do resultado da comparação.
## [1] TRUE
## [1] FALSE
## [1] TRUE
## [1] FALSE
## [1] TRUE
## [1] FALSE
## [1] FALSE
## [1] TRUE
- Valores especiais
Os valores especiais são usados para representar situações atípicas ou condições especiais nos dados, como valores ausentes, infinitos ou indefinidos.
- NA (Not Available): O valor NA representa dados ausentes ou não disponíveis.
## [1] NA
## [1] TRUE
## [1] FALSE FALSE FALSE
- NaN (Not a Number): um tipo especial de NA, usado para representar resultados indefinidos de operações matemáticas, como divisões por zero.
## Warning in log(-1): NaNs produzidos
## [1] TRUE
## [1] TRUE
- Inf e -Inf (Infinito): Inf e -Inf representam valores infinitos.
## [1] TRUE
- NULL: representa a ausência de um valor ou objeto. Diferente do NA, que representa um valor ausente dentro do de um vetor ou lista, NULL indica que o objeto não existe. Usamos normalmente para iniciar variáveis ou para remover elementos de listas.
## [1] TRUE
3.5 Estrutura de Dados em R
- Vetores
Os vetores são uma estrutura de dados que armazena uma sequência de elementos, sendo todos do mesmo tipo (número, caracteres ou valores lógicos).
- Vetor numérico:
## [1] 22
## [1] 11 33
## [1] 33 11 44 22
## [1] 11 22 33
## [1] 22 44 66 88
# Soma com escalar (soma cada elemento)
v <- n+1
# Soma de Vetores (soma cada termo de n com o elemento de mesmo índice de v)
n+v
## [1] 23 45 67 89
## [1] 132 506 1122 1980
# Produto Escalar (multiplica os dois vetores da mesma posição e soma os resultados dessas multiplicações)
n%*%v
## [,1]
## [1,] 3740
# Quando somamos vetores de tamanhos diferentes repetimos os elementos até o tamanho do maior
n - c(1,2)
## [1] 10 20 32 42
# Caso o tamanho de um deles naõ seja multiplo do outro, o R solta uma mensagem de erro
c(1,2,3) - n
## Warning in c(1, 2, 3) - n: comprimento do objeto maior não é múltiplo do
## comprimento do objeto menor
## [1] -10 -20 -30 -43
- Vetor de Caracteres:
Nomes = c("Letícia","Mariana","Guilherme","Viviane",
"Ana","Otávio","Eduardo")
# Identificando o tipo de vetor
typeof(Nomes)
## [1] "character"
## [1] "character"
- Vetor de valores lógicos:
Feminino = c(TRUE,TRUE,FALSE,TRUE, TRUE, FALSE, FALSE)
# Identificando o tipo de vetor
class(Feminino)
## [1] "logical"
## [1] 4
- Matrizes
Matrizes é uma estrutura de dados que permite armazenar os dados de uma forma bidimensional, com linhas e colunas. Todos os elementos precisam ser do mesmo tipo.
## [1] 3 3
## [1] 2
## [1] 1 2 3
## [1] 3 4 1
## [1] 1
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
- Listas
Diferente dos vetores, as listas podem armazenar objetos de tipos diferentes, sendo muito mais flexíveis.
lista <- list(
nome = "Letícia",
notas = c(8, 10, 9, 7, 6, 8),
matriz = matrix(1:4, nrow = 2)
)
# Acessando elementos de uma lista
lista[[3]] # usando o índice
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
## [1] 8 10 9 7 6 8
## $nome
## [1] "Letícia"
##
## $notas
## [1] 8 10 9 7 6 8
- Fatores
No R, a estrutura de dados fatores podem ser usadas para representar os dados categóricos, ou seja, variáveis que assumem valores diferentes, como níveis, podendo ser ordenados ou não.
nivel_educacional <- factor(c("Fundamental", "Médio", "Superior"))
satisfacao <- factor(c("baixa", "alta", "média"),
levels = c("baixa", "média", "alta"), # indica os níveis
ordered = TRUE) # indica que a ordem dos níveis importa
Para trabalhar com fatores podemos usar o pacote forcats, que nos fornece funções para criar, modificar e organizar fatores de forma eficiente, sendo possível reordenar níveis com base em valores associados, agrupar categorias raras, ordenar níveis com base em suas frequências e trabalhar com dados categóricos de forma mais eficaz. Ainda nesse capítulo, falaremos mais sobre a instalação e o uso de pacotes dentro do RMarkdown.
- Data Frames
Os Data Frames são uma das estruturas mais usadas para armazenar os dados em formato de tabela. Cada coluna é um vetor de mesmo tamanho e pode ter tipos diferentes (números, caracteres, fatores, etc.).
df <- data.frame(
nome = c("Mariana", "Juliana", "Isabela"),
idade = c(19, 8, 14),
altura = c(1.68, 1.50, 1.55)
)
# Acessando colunas
df$nome
## [1] "Mariana" "Juliana" "Isabela"
# Acessando elementos usando colchetes - o primeiro indíce refere-se as linhas e o segundo a # as colunas
df[, "idade"]
## [1] 19 8 14
## nome idade altura
## 1 Mariana 19 1.68
## [1] 1.68
Por mais que possa parecer com a estrutura de listas, o data frame é uma tabela de dados em formato de linhas e colunas. Diferente de uma lista, as suas colunas devem ter o mesmo número de elementos.
Também podemos manipular os data frames no R usando banco de dados.
# Carregando o banco de dados 'iris'
data("iris")
# Vendo o conteúdo do banco de dados
# iris # tudo
head(iris) # primeiros elementos
## 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
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
## [1] 150 5
## [1] 150
## [1] 5
## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12"
## [13] "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24"
## [25] "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36"
## [37] "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48"
## [49] "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60"
## [61] "61" "62" "63" "64" "65" "66" "67" "68" "69" "70" "71" "72"
## [73] "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
## [85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96"
## [97] "97" "98" "99" "100" "101" "102" "103" "104" "105" "106" "107" "108"
## [109] "109" "110" "111" "112" "113" "114" "115" "116" "117" "118" "119" "120"
## [121] "121" "122" "123" "124" "125" "126" "127" "128" "129" "130" "131" "132"
## [133] "133" "134" "135" "136" "137" "138" "139" "140" "141" "142" "143" "144"
## [145] "145" "146" "147" "148" "149" "150"
3.6 Estruturas de controle
As estruturas de controles são “instruções” que nos permiter criar lógica nos programas e determinar como as operações e funções serão excecutadas.
- Condicionais
As estruturas condicionais permitem executar blocos de código com base em condições lógicas. Elas verificam se determinada condição é verdadeira ou falsa e excecutam diferentes blocos do código com base no resultado.
O comando if avalia se uma condição é verdadeira (TRUE), caso seja o bloco de código associado é excecutado.
# if (condição) {
# Código executado se a condição for TRUE
# }
# Exemplo
a <- 10
if (a > 5) {
print("a é maior que 5")
}
## [1] "a é maior que 5"
Quando é necessário tratar tanto o caso que a condição é verdadeira, quanto o caso em que é falsa, utilizamos if - else.
# if (condição) {
# Código executado se a condição for TRUE
# } else {
# Código executado se a condição for FALSE
# }
# Exemplo
b <- 3
if (b > 5) {
print("b é maior que 5")
} else {
print("b é menor ou igual a 5")
}
## [1] "b é menor ou igual a 5"
Quando temos mais de uma condição usamos if - else if - else.
# if (condição1) {
# Código executado se condição1 for TRUE
# } else if (condição2) {
# Código executado se condição1 for falsa e condição2 for TRUE
# } else {
# Código executado se nenhuma das condições anteriores for TRUE
# }
# Exemplo
c <- 0
if (c > 0) {
print("c é positivo")
} else if (c < 0) {
print("c é negativo")
} else {
print("c é zero")
}
## [1] "c é zero"
Quando se trata de analisar vetores, podemos usar ifelse, que avalia cada elemento de vetor de maneira individual.
# ifelse(condição, valor_se_verdadeiro, valor_se_falso)
# Exemplo
d <- c(-5, 0, 4, 9)
resposta <- ifelse(d > 0, "positivo", "não positivo")
print(resposta)
## [1] "não positivo" "não positivo" "positivo" "positivo"
- Laços de repetição
Os laços de repetição (ou loops) em R nos permitem executar blocos de códigos múltipla vezes. Temos dois principais tipos: for e while.
O for é um laço de iteração, usado para iterar sobre uma sequência, como vetores, listas, etc.
# for (variável in sequência) {
# Código a ser executado
# }
# Exemplo
for (i in 1:5) {
print(paste("O quadrado de", i, "é", i^2))
}
## [1] "O quadrado de 1 é 1"
## [1] "O quadrado de 2 é 4"
## [1] "O quadrado de 3 é 9"
## [1] "O quadrado de 4 é 16"
## [1] "O quadrado de 5 é 25"
No exemplo acima a variável “i” assume o valor de cada número da sequência em cada iteração, ou seja, i assume a sequência de números de 1 a 5.
O while é um laço condicional, ou seja, executa o bloco de código enquanto a condição determinada for verdadeira.
# while (condição) {
# Código a ser executado
# }
# Exemplo
a <- 1
while (a <= 5) {
print(a)
a <- a + 1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
O exemplo acima realiza uma contagem de 1 até 5. O valor da variável “a” começa em 1, a condição a <= 5 é verificada e enquanto ela for verdadeira o código dentro do laço é executado. A cada iteração o valor de x é impresso e incrementado 1. O loop finaliza assim que a se torna 6, ou seja, o momento em que a condição x<= 5 se torna falsa.
É preciso tomar cuidado para que o while não se torne um loop infinito, ou seja, é necessário garantir que a condição imposta no while se torne falsa em algum momento.
3.7 Funções
As funções são blocos de código reutilizáveis que nos permitem executar tarefas específicas. A estrutura básica de uma função é: - Nome da função; - Argumentos (entrada que a função espera receber); - Corpo da função (especifica o que a função faz); - Valor de retorno (o que a função retorna após a execução).
soma <- function(a, b){
resultado <- a + b
return(resultado)
}
# Testando a função 'soma'
soma(7, 3)
## [1] 10
Podemos criar funções utilizando estruturas de controle, para determinar o fluxo de execução do código.
# Função que calcula o fatorial de um inteiro não negativo
fatorial <- function(n){
if(n<0){
print("Número negativo! Digite um inteiro positivo!")
return()
}
f <- 1
while(n>1){
f <- f*n
n <- n-1
}
return(f)
}
# Testa a função 'fatorial'
fatorial(4)
## [1] 24
## [1] "Número negativo! Digite um inteiro positivo!"
## NULL
Podemos criar também função com valores padrões, atribuindo valores aos argumentos. Dessa forma, se o usuário não fornecer um valor ao chamar a função, o valor padrão é utilizado.
subtracao <- function(a, b = 1) {
resultado <- a - b
return(resultado)
}
# Testando a função 'subtracao'
subtracao(7, 2) # com os dois argumentos
## [1] 5
## [1] 4
3.8 Funções Básicas e Pacotes
As funções básicas são aquelas já incorporadas na linguagem, que não requerem pacotes adicionais. Alguns exemplos são: - ‘mean()’ para calcular a média de um vetor - ‘sd()’ para o desvio padrão. - ‘sum()’ para somar os elementos de um vetor. - ‘prod()’ – Multiplica todos os elementos de um vetor.
Já os pacotes são coleções de funções que estendem a funcionalidade do R, permitindo a realização de análises mais específicas. Os pacotes que usaremos nessa apostila são: ggplot2, dplyr, tdyr, forcats, tibble
Pacotes podem ser instalados usando install.packages("nome_do_pacote")
e carregados com library(nome_do_pacote)
.
3.9 Exercícios
- Crie dois vetores de números inteiros: vetor1 e vetor2, ambos com a mesma quantidade de elementos. Depois realize as seguintes operações:
- some os dois vetores.
- subtraia o vetor 1 do vetor2.
- multiplique os dois vetores, elemento por elemento.
- Crie duas matrizes de dimensões 3x3. Depois realize as seguintes operações:
- some as duas matrizes.
- subtraia a segunda matriz da primeira.
- multiplique as duas matrizes.
- Crie um data.frame chamado alunos com três colunas: Nome, Idade e Nota. Preencha o data.frame com pelo menos 5 registros. Em seguida, crie uma nova coluna chamada Aprovado, que será TRUE se a Nota for maior ou igual a 5 e FALSE caso contrário.
Escreva uma função que retorna uma matriz “E” em que cada elemento é o valor “b” elevado a cada elemento da matriz M. Como padrão, b=e.
Escreva uma função que recebe dois parâmetros: base e altura, e retorna a área de um triângulo.
Escreva uma que recebe um vetor de números e retorna uma lista com a quantidade de números positivos e a quantidade de números negativos no vetor.