Introdução à linguagem R

Este texto apresenta a linguagem R, mostrando como ela pode ser usada para transformação de dados.

RStudio

Usaremos o RStudio, que é um ambiente integrado de desenvolvimento (IDE) para a linguagem R.

Ele também está disponível online: (RStudio Cloud).

Variáveis e operações

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

Vetores

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

Valores faltando (NA)

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

Obtendo ajuda

Para consultar a documentação de uma função, execute o comando ?nomeDaFuncao. Exemplo:

?mean

Instalando pacotes

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 frames

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

Operador pipe

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.