rpubs.com/brunamdalmoro/fundamentos_R
Bruna Martini Dalmoro
Bacharela em Estatística (UFRGS)
Mestra em Ciência da Computação (PUCRS)
Cientista de Dados no Sicredi desde 2018
Organizadora do R-Ladies POA
Apaixonada por R desde 2013
O R é uma linguagem de programação desenvolvido especialmente para cálculos estatísticos e criação de gráficos.
A comunidade R é uma das maiores forças do ecossistema R. Ela é colaborativa, ativa e global, e não só contribui com pacotes e tutoriais, como também é conhecida por sua abertura, inclusão e foco educacional.
O RStudio é um ambiente de desenvolvimento integrado (IDE) para a linguagem R. Ele foi criado para tornar o uso do R mais fácil, produtivo e acessível.
Uma maneira de acessar o RStudio de qualquer lugar, sem precisar instalar no computador.
Warning
Há limitações de tempo (25h/mês) e processamento no plano gratuito.
Você pode usar o R para fazer cálculos matemáticos básicos:
Experimente! Execute no seu computador:
Você pode usar o R para fazer cálculos matemáticos básicos:
Note
Linguagens como o C ou Java necessitam que o código seja compilado antes de executar. No R, isso não é necessário. O R é uma linguagem de programação dinâmica que interpreta o código enquanto você o executa.
()^* e Divisão /+ e Subtração -2 + 3 * 4 # Multiplicação primeiro: 3*4=12; depois soma: 2+12=14
(2 + 3) * 4 # Parênteses primeiro: 2+3=5; depois multiplica: 5*4=20
2 + 3 + 4 / 2 # Divisão primeiro: 4/2=2; depois soma: 2+3+2=7
2^2 + 3 # Exponenciação primeiro: 2^2=4; depois soma: 4+3=7Tip
Sempre utilize parênteses!
| Operação | Símbolo | Exemplo | Resultado |
|---|---|---|---|
| Adição | + |
2 + 3 |
5 |
| Subtração | - |
7 - 4 |
3 |
| Multiplicação | * |
5 * 2 |
10 |
| Divisão | / |
10 / 2 |
5 |
| Potência | ^ |
2 ^ 3 |
8 |
| Módulo (resto) | %% |
7 %% 3 |
1 |
| Divisão inteira | %/% |
7 %/% 3 |
2 |
Você pode criar objetos com o operador de atribuição <-:
Note
Note que o valor de x não é impresso, ele é apenas armazenado. Perceba também que foi criado um item no environment.
Existem outras formas de fazer atribuição, além de <-.
Por exemplo:
[1] "Tambem podemos armazenar texto em objetos"
Tip
Boas práticas: Prefira sempre ter o nome do objeto no início do código e utilize o atribuidor <-. Essa é a forma mais comum, deixa o código mais claro e fácil de entender.
Podemos usar os objetos armazenados para fazer operações:
O R ignorará qualquer texto após # em uma linha. Isso permite que você escreva comentários. Eles não afetarão seu código, mas são muito úteis para descrever brevemente o que o código a seguir faz.
# Este é um comentário!
# Armazenando a soma de dois valores
z <- 2025 + 50
# Exibindo o resultado da soma
z[1] 2075
Tip
Use comentários sem moderação! Descrever o que cada parte do código faz e por que facilita o entendimento do código, seja por você mesmo ou por outra pessoa.
No R, o nome dos objetos devem começar sempre com letras, e só podem conter letras, números, _ e ..
Tip
Evite usar acentos, til e cedilha. Isso pode gerar erros de encoding.
É importante aprendermos a conviver com nossos erros!
Artwork by @allison_horst
idade_em_meses. Em seguida, multiplique esse objeto por 30 e salve o resultado em um objeto chamado idade_em_dias.Funções são blocos de código que executam uma tarefa específica.
Elas recebem valores de entrada (chamados de argumentos), realizam algum processamento e retornam um resultado (também chamado de saída).
Estrutura de uma função:
nome_da_funcao(argumento1 = valor1, argumento2 = valor2, …)
| Função | Descrição |
|---|---|
print() |
Exibe um valor ou resultado na tela |
length() |
Retorna o número de elementos em um vetor ou lista |
sum() |
Calcula a soma de valores |
mean() |
Calcula a média aritmética dos valores |
min() |
Retorna o menor valor |
max() |
Retorna o maior valor |
seq() |
Gera uma sequência de números |
rep() |
Repete elementos um número específico de vezes |
paste() |
Junta textos (strings) com separadores definidos |
sqrt() |
Calcula a raiz quadrada de um número |
round() |
Arredonda um número para um número específico de casas decimais |
ls() |
Lista todos os objetos no ambiente |
rm() |
Remove um ou mais objetos do ambiente |
Caso você não conheça determinada função, tenha dúvidas do seu funcionamento ou de quais parâmetros você precisa passar para ela, você pode acessar a documentação de ajuda diretamete no RStudio!
Basta digitar:
?nome_da_funcao
Note que não usamos os parênteses, apenas onome da função!
Tip
Funções são o coração do R. Daqui para frente, usaremos funções o tempo todo!
seq() e rep(). O que estas funções fazem? Quais são os argumentos esperados? Execute um exemplo.Existem diferentes tipos de dados (ou classes) que podemos armazenar em objetos no R, como números, textos, lógicos, fatores, datas, entre outros.
É muito importante identificar o tipo de dado que estamos trabalhando, pois cada tipo de dado permite usar funções específicas.
A função class() permite verificar a classe de um objeto.
Os objetos numéricos no R podem ser de dois tipos:
O tipo character (ou também conhecido como string) armazena textos. Tudo que for escrito entre aspas será considerado um texto.
Note
Na maior parte do tempo, o R entende aspas simples e aspas duplas da mesma maneira.
O tipo lógico (logical) armazena valores booleanos: TRUE (verdadeiro) ou FALSE (falso). Os valores binários podem ser convertidos para números, onde TRUE será 1, e FALSE será 0.
| Operação | Símbolo | Exemplo | Resultado |
|---|---|---|---|
| Igualdade | == |
3 == 3 |
TRUE |
| Diferença | != |
3 != 2 |
TRUE |
| Maior que | > |
5 > 2 |
TRUE |
| Menor que | < |
1 < 4 |
TRUE |
| Maior ou igual | >= |
4 >= 4 |
TRUE |
| Menor ou igual | <= |
2 <= 1 |
FALSE |
| E (lógico) | & |
TRUE & FALSE |
FALSE |
| Ou (lógico) | | |
TRUE | FALSE |
TRUE |
| Negação lógica | ! |
!TRUE |
FALSE |
O tipo data (Date) armazena datas no formato aaaa-mm-dd (ano-mês-dia).
O tipo fator (factor) armazena variáveis categóricas. Os valores possíveis de categoria são chamados de levels. Os fatores podem ser ordenados ou não ordenados.
Os fatores são muito úteis para a visualização de dados e para alguns modelos de análise de dados.
Eis um exemplo de fator:
Além da função class(), outra forma de identificar se um objeto é de determinado tipo é:
[1] 4
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE
Exercício: O resultado da função is.numeric() é que que tipo?
E podemos converter o objeto de um tipo em outro:
Valores faltantes, conhecidos também como missing values, são valores que não estão disponíveis, ou que não foram informados. No R, esses valores são representados pelo valor NA (Not Available).
Algo importante é que o R não consegue fazer operações matemáticas com valores NA. Por exemplo, se tentarmos realizar qualquer operação matemática com NA, o resultado será NA:
É importante identificar os valores NA em nossos dados, pois eles podem afetar o resultado de nossas análises.
Futuramente entenderemos como lidar melhor com esses valores faltantes!
No R, estruturas de dados são formas de organizar e armazenar informações para facilitar a análise. Cada estrutura tem características próprias e é adequada para diferentes tipos de tarefas.
Vetores armazenam um conjunto de valores de uma dimensão. Eles podem ser criados com a função c(), que significa combine (combinar).
Vetores são conjuntos indexados, ou seja, conseguimos acessar individualmente cada valor de um vetor de acordo com sua posição.
Para isso, colocamos o índice da posição que queremos acessar dentro de colchetes [].
Usando a indexação, podemos substituir valores!
Note
Importante! No R, o primeiro elemento de um vetor sempre é o de índice 1. Não há índice zero no R!
frutas.
paste("eu gosto de", frutas). O tamanho do vetor mudou?dolar_subiu <- c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE) indicando se o dólar subiu (TRUE) ou não subiu (FALSE) no respectivo dia. Interprete o resultado dos códigos abaixo:
length(dolar_subiu)dolar_subiu[2]sum(dolar_subiu)mean(dolar_subiu)Matrizes são como os vetores, porém com uma dimensão a mais, dividindo os dados em linhas e colunas.
| Tipo de operação | Exemplo | O que faz / resultado |
|---|---|---|
| Soma de matrizes | A + B |
Soma elemento a elemento |
| Subtração de matrizes | A - B |
Subtrai elemento a elemento |
| Multiplicação elemento a elemento | A * B |
Multiplica elemento a elemento |
| Multiplicação matricial (algebra linear) | A %*% B |
Produto de matrizes |
| Transposta | t(A) |
Troca linhas por colunas |
| Determinante | det(A) |
Determinante da matriz |
| Inversa | solve(A) |
Matriz inversa (se existir) |
| Indexação | A[1,2] |
Elemento na 1ª linha, 2ª coluna |
| Submatriz | A[1:2, ] |
Subconjunto: primeiras 2 linhas |
Experimente!
| Função | O que faz | Exemplo |
|---|---|---|
dim() |
Retorna as dimensões | dim(A) |
nrow() |
Número de linhas | nrow(A) |
ncol() |
Número de colunas | ncol(A) |
rowSums() |
Soma dos elementos de cada linha | rowSums(A) |
colSums() |
Soma dos elementos de cada coluna | colSums(A) |
rowMeans() |
Média dos elementos de cada linha | rowMeans(A) |
colMeans() |
Média dos elementos de cada coluna | colMeans(A) |
apply() |
Aplica função a linhas ou colunas | apply(A, 1, sum) |
Experimente!
Da mesma forma que vetores, matrizes podem armazenar diferentes tipos de dados, mas cada matriz pode armazenar apenas um tipo de dado por vez.
Se tratando de análise de dados, isso é pouco útil. Por isso foi criado uma estrutura de dados mais versátil: o dataframe!
Bem-vindos ao R!
Os dataframes são conjuntos de valores com duas dimensões: linhas e colunas. Porém, diferente do que vimos para as matrizes, os dataframes podem armazenar diferentes tipos de dados em cada coluna.
Esse é o principal tipo de objeto que utilizaremos no R, pois ele é muito útil para armazenar dados tabulares!
Existem alguns dataframes já criados no R, como o airquality, que armazena dados sobre a qualidade do ar na cidade de Nova York, em 1973. Essas são as primeiras linhas do dataframe:
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
Para saber mais sobre os dados, digite ?airquality.
Existem algumas funções úteis para entendermos qual a estrutura de um dataframe:
[1] 6
[1] 153
[1] 153 6
[1] "Ozone" "Solar.R" "Wind" "Temp" "Month" "Day"
'data.frame': 153 obs. of 6 variables:
$ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ...
$ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
$ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
$ Month : int 5 5 5 5 5 5 5 5 5 5 ...
$ Day : int 1 2 3 4 5 6 7 8 9 10 ...
Ozone Solar.R Wind Temp
Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00
1st Qu.: 18.00 1st Qu.:115.8 1st Qu.: 7.400 1st Qu.:72.00
Median : 31.50 Median :205.0 Median : 9.700 Median :79.00
Mean : 42.13 Mean :185.9 Mean : 9.958 Mean :77.88
3rd Qu.: 63.25 3rd Qu.:258.8 3rd Qu.:11.500 3rd Qu.:85.00
Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00
NA's :37 NA's :7
Month Day
Min. :5.000 Min. : 1.0
1st Qu.:6.000 1st Qu.: 8.0
Median :7.000 Median :16.0
Mean :6.993 Mean :15.8
3rd Qu.:8.000 3rd Qu.:23.0
Max. :9.000 Max. :31.0
Como em matrizes, devemos usar dois índices para acessar os valores de um dataframe.
Muitas vezes trabalhamos com apenas uma coluna do dataframe, e para isso precisamos selecioná-la. Eis algumas formas:
É degrande utilidade sabermos filtrar os dataframes para explorarmos nossos dados! Há algumas formas de fazer isso:
## Uma condição
# Temp for menor que 60
airquality[airquality$Temp < 60, ]
# Dados dados faltantes na coluna Ozone
airquality[is.na(airquality$Ozone), ]
# Mês de junho
subset(airquality, Month == 6)
## Mais de uma condição
# Mês de julho, dias de 1 a 5
airquality[airquality$Month == 7 & airquality$Day <= 5, ]
# Temp acima de 90 e sem dados faltantes em Ozone
subset(airquality, Temp > 90 & !is.na(Ozone))Nos dataframes, podemos facilmente criar novas colunas!
# Criando a coluna de temperatura em Celsius
airquality$TempCelsius <- (airquality$Temp - 32) * (5/9)
# Cinco primeiras linhas do dataframe atualizado
head(airquality, n = 4) Ozone Solar.R Wind Temp Month Day TempCelsius
1 41 190 7.4 67 5 1 19.44444
2 36 118 8.0 72 5 2 22.22222
3 12 149 12.6 74 5 3 23.33333
4 18 313 11.5 62 5 4 16.66667
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
Usando o dataset mtcars:
mpg e hp.mtcars para mostrar apenas os carros com mpg maior que 25.cyl é igual a 6 e hp maior que 110.mpg não é maior que 20.kmpl (quilômetros por litro = milhas por galão * 0.425).gear.Usando o dataset iris:
Sepal.Length maior que 7.Sepal.Width é maior que a média dessa coluna.Um passo importante na tarefa de importação de dados para o R é saber onde está o arquivo que queremos importar. Toda função de importação vai exigir um caminho, ou seja, uma string que representa o endereço do arquivo no computador.
Há duas formas de passarmos o caminho de um arquivo: usar o caminho absoluto ou usar o caminho relativo.
Mas caminho relativo a quê?
O diretório de trabalho (working directory) nada mais é do que a pasta em que o R vai procurar arquivos na hora de ler informações ou gravar arquivos na hora de salvar objetos.
Se você não estiver trabalhando em um projeto R, ou não definiu uma pasta específica, (no Windows) provavelmente seu diretório de trabalho será a pasta “Documentos”.
Mas caso você não saiba qual o diretório de trabalho que o R está considerando, basta usar a função getwd().
Caso você queria trocar seu diretório de trabalho, você pode usar a função setwd().
.csvUm arquivo CSV (Comma-Separated Values - valores separados por vírgula) é um formato simples e amplamente utilizado para armazenar dados em formato tabular.
No R, para ler estes dados, basta usar a função read.csv(), passando o caminho do arquivo.
Porém, nem sempre o separador do arquivo é uma vírgula. Nestes casos você pode usar o argumento sep, ou ainda, em casos de separação por ; (comumente usado no Brasil e Europa), a função read.csv2().
O arquivo .csv é um arquivo de texto, com separador de colunas por vírgula. Mas os dados podem estar em arquivos .txt, ou ainda com outros separadores. Algumas funções úteis nesses casos são:
Os separadores mais comuns são:
sep = ','sep = ';'sep = '\t'E o arquivo excel?
.csv e .xlsx.csv é um arquivo texto, simples, ideal para trocar dados entre sistemas e linguagens de programação.
.xls/.xlsx é o formato completo e formatado do Excel, com formatação visual, fórmulas, várias abas.
Warning
Evite ao máximo consumir dados de arquivos .xlsx. Inclusive prefira, quando possível, salvar apenas os dados necessários em formato .csv e, assim, ler os dados.
.xlsxPara ler arquivos em .xlsx usaremos um pacote específico para isso: o readlxl.
É possível ler arquivos no R via point-and-click.
Muitas vezes, depois de tratarmos o dado, será necessário salvar este arquivo novamente. Para isso, podemos as seguintes funções:
# salvar em formato CSV
write.csv(dados, "arquivo.csv", row.names = FALSE)
# salvar CSV com separador ponto e vírgula
write.csv2(dados, "arquivo.csv", row.names = FALSE)
write.csv(dados, "arquivo.csv", row.names = FALSE, sep = ';')
# salvar arquivos de texto
write.table(dados, "arquivo.txt", sep = "\t", row.names = FALSE).rdsUm .rds é um arquivo binário que armazena um objeto R. Ele mantém toda a estrutura do objeto, incluindo tipos de dados, fatores, atributos, classes etc.
É ideal para guardar dados tratados, limpos, ou resultados de análise/modelos, e depois reutilizar no próprio R.
Tip
Este formato é muito útil quando estamos trabalhando em um projeto R! Caso o objeto salvo será usando apenas no R novamente, priorize este formato.
Para começar, baixe a base de dados top_songs_spotify.csv. Sua versão original Top Spotify Listening History Songs in Countries está disponível no Kaggle.
read.csv(), read.delim() e read.table(). Que argumentos foram necessários usar em cada uma delas?ms_played em caractere. Tranforme a variável platform em fator, usando a função as.factor()..csv com o separador ;. Salve também no formato .rds..csv novo usando a função read.csv2(). Leia o arquivo .rds. Qual a diferença entre os dois?Wickham, H., & Grolemund, G. (2017). R for data science (Vol. 2). O’Reilly.
James, L., & Teetor, P. (2019). R Cookbook, 2nd Edition. O’Reilly.