Este texto apresenta a linguagem R, mostrando como ela pode ser usada para transformação de dados.
Usaremos o RStudio, que é um ambiente integrado de desenvolvimento (IDE) para a linguagem R.
Ele também está disponível online: (RStudio Cloud).
O ambiente R inclui um console no qual pode-se digitar expressões e ver o resultado. Exemplo:
1 + 1
## [1] 2
Como em outras linguagens de programação, pode-se atribuir valores a variáveis. Em R, usa-se o operador de atribuição (<-). Exemplo:
x <- 2
y <- 3
x + y
## [1] 5
Também podemos realizar comparações entre os valores. Exemplo:
x < y
## [1] TRUE
x == 9
## [1] FALSE
R possui a estrutura vetor, que é uma lista de elementos do mesmo tipo. Pode-se criar um vetor usando a notação c(elemento1, elemento2, ...). Exemplo (notas de 4 alunos em duas provas):
aluno <- c("Fulano", "Sicrano", "Beltrano", "Zutano")
prova <- c(4.8, 4.3, 5.7, 8.0)
trabalho <- c(6.5, 3.6, 6.8, 7.7)
prova
## [1] 4.8 4.3 5.7 8.0
Algumas operações com vetores:
# Somar um valor a todos os elementos do vetor
prova + 2
## [1] 6.8 6.3 7.7 10.0
# Comparar cada elemento com um valor específico
prova > 5
## [1] FALSE FALSE TRUE TRUE
# Comparar cada elemento com um valor específico
prova == 8.0
## [1] FALSE FALSE FALSE TRUE
# Somar os elementos correspondentes de dois vetores
prova + trabalho
## [1] 11.3 7.9 12.5 15.7
# Exemplo: tirar a média das duas provas
(prova + trabalho) / 2
## [1] 5.65 3.95 6.25 7.85
# Acessar o segundo elemento de um vetor
prova[2]
## [1] 4.3
# Acessar o terceiro e o quarto elementos de um vetor
prova[c(FALSE, TRUE, FALSE, TRUE)]
## [1] 4.3 8.0
# Acessar o terceiro e o quarto elementos de um vetor
# F e T são sinônimos de FALSE e TRUE
prova[c(F, T, F, T)]
## [1] 4.3 8.0
# Acessar somente os elementos de um vetor maiores que 5
prova[prova > 5]
## [1] 5.7 8.0
# Identificar alunos com nota da prova superior a 5
aluno[prova > 5]
## [1] "Beltrano" "Zutano"
Também podemos executar funções sobre os vetores:
# Comprimento do vetor (número de elementos)
length(prova)
## [1] 4
# Média entre os valores
mean(prova)
## [1] 5.7
# Soma dos valores
sum(prova)
## [1] 22.8
# Primeiros dois valores
head(prova, 2)
## [1] 4.8 4.3
Para consultar a documentação de uma função, digite ? seguido do nome da função. Exemplo:
?head
Suponha que um dos alunos não fez o trabalho. Usamos a palavra especial NA para indicar valores que não existem ou cujo valor é desconhecido. Exemplo:
aluno <- c("Fulano", "Sicrano", "Beltrano", "Zutano")
prova <- c(4.8, 4.3, 5.7, 8.0)
trabalho <- c(NA, 3.6, 6.8, 7.7)
prova
## [1] 4.8 4.3 5.7 8.0
NA é um valor esquisito. Observe:
1 == 1
## [1] TRUE
NA == NA
## [1] NA
Como saber se um valor é NA? Usando a função is.na():
is.na(NA)
## [1] TRUE
# Quais trabalhos possuem nota?
!is.na(trabalho)
## [1] FALSE TRUE TRUE TRUE
Voltando ao trabalho…
trabalho
## [1] NA 3.6 6.8 7.7
Qual a média das notas do trabalho?
mean(trabalho)
## [1] NA
Não é possível determinar a média dos 4 valores uma vez que um valor está faltando. Se quisermos ignorar os valores NA e tirar a média somente dos demais valores, devemos chamar a função mean passando o valor TRUE para o parâmetro na.rm:
mean(trabalho, na.rm=TRUE)
## [1] 6.033333
Isso é equivalente a:
mean(trabalho[!is.na(trabalho)])
## [1] 6.033333
Para consultar a documentação de uma função, execute o comando ?nomeDaFuncao. Exemplo:
?mean
Use o comando install.packages("nomeDoPacote").
Neste curso usaremos o pacote tidyverse, que é na verdade uma coleção de pacotes úteis para análise de dados, e inclui pacotes como tidyr, dplyr, ggplot2, dentre outros.
install.packages("tidyverse")
Depois de instalado, você precisa carregar o pacote usando a função library(nomeDoPacote). Assim:
#library(tidyverse)
Alternativamente, você pode carregar somente os pacotes do tidyverse que deseja usar. Por exemplo:
library(dplyr)
library(ggplot2)
Data frame é uma das estruturas de dados mais importantes do R, e se assemelha muito a uma tabela em um banco de dados ou a uma planilha com certas restrições. Um data frame é uma lista de vetores de mesmo tamanho, onde cada vetor possui um nome e representa uma coluna da tabela.
Geralmente os data frames são lidos a partir de arquivos CSV, xlsx ou outros formatos. O formato CSV é suportado nativamente peo R. Exemplo:
dados <- read.csv('data/tamanhos.txt')
dados
## classe versao tamanho
## 1 Tela.java 1 235
## 2 Tela.java 3 311
## 3 Tela.java 2 288
## 4 Config.java 3 12
## 5 Config.java 2 23
## 6 Config.java 1 30
Você também pode usar a função read_csv do pacote readr (incluído no pacote tidyverse):
dados <- read_csv('data/tamanhos.txt')
Podemos acessar colunas da tabela (i.e., vetores) usando $. Exemplo:
dados$tamanho
## [1] 235 311 288 12 23 30
mean(dados$tamanho)
## [1] 149.8333
Algumas funções úteis para data frames:
# Primeiras 4 linhas
head(dados, 4)
## classe versao tamanho
## 1 Tela.java 1 235
## 2 Tela.java 3 311
## 3 Tela.java 2 288
## 4 Config.java 3 12
# Últimas 4 linhas
tail(dados, 4)
## classe versao tamanho
## 3 Tela.java 2 288
## 4 Config.java 3 12
## 5 Config.java 2 23
## 6 Config.java 1 30
# Número de linhas
nrow(dados)
## [1] 6
# Número de colunas
ncol(dados)
## [1] 3
# Sumário estatístico
summary(dados)
## classe versao tamanho
## Config.java:3 Min. :1.00 Min. : 12.00
## Tela.java :3 1st Qu.:1.25 1st Qu.: 24.75
## Median :2.00 Median :132.50
## Mean :2.00 Mean :149.83
## 3rd Qu.:2.75 3rd Qu.:274.75
## Max. :3.00 Max. :311.00
A biblioteca dplyr do tidyverse inclui o operador %>%, chamado de pipe (lê-se “páipe”). Ele pode ser pensado como um cano que transporta os dados do lado esquerdo para o lado direito até chegar no final.
Se você tem uma função no seguinte formato:
funcao(argumento1, argumento2, argumento3, ...)
… ela pode ser reescrita como
argumento1 %>% funcao(argumento2, argumento3, ...)
Por exemplo, a instrução a seguir
tail(dados, 4)
… pode ser reescrita como
dados %>% tail(4)
Usar o operador pipe pode tornar os programas mais legíveis, sobretudo, quando há chamadas de função aninhadas. Exemplo:
# Calcular o sumário estatístico das 4 primeiras linhas
summary(head(dados, 4))
# Calcular o sumário estatístico das 4 primeiras linhas (com pipe)
dados %>%
head(4) %>%
summary()
Usando o pipe, as funções aparecem na ordem em que são chamadas.