Capítulo 5 Processamento de dados
O R possui diversas funções para várias operações com manejo de dados e neste tópico iremos ensinar o básico, ou seja, como importá-los, exportá-los e editá-los no R. Na maioria das vezes os dados não estão em um formato ideal e precisamos manejá-los. A manipulação de dados envolve a transformação de um tipo de objeto em outro, limpeza e filtragem, agregações, reestruturação e junção dos dados.
Para obter os arquivos de input utilizados neste tópico acesse:
5.1 Primeiros passos
5.1.1 Tipos de variáveis
Os objetos no R, podem armazenar diferentes tipos de dados, no decorrer deste subtópico iremos trabalhar com alguns desses tipos.
# -- TIPOS DE VARIAVEIS --
## tipo caracter
<- "string"
caracter
## tipo numerico inteiro
<- 7L
inteiro
## tipo numerico decimal
<- 7.5
decimal
## tipo logico
<- TRUE logico
Para verificar o tipo de cada objeto criado vamos utilizar a função class()
.
# -- VERIFICACAO DE VARIAVEIS --
## funcao class()
class(caracter)
## [1] "character"
class(inteiro)
## [1] "integer"
class(decimal)
## [1] "numeric"
class(logico)
## [1] "logical"
## funcao is.
is.double(caracter)
## [1] FALSE
is.numeric(caracter)
## [1] FALSE
is.character(caracter)
## [1] TRUE
is.double(decimal)
## [1] TRUE
is.numeric(decimal)
## [1] TRUE
is.integer(decimal)
## [1] FALSE
Existem também tipos mais complexos como: vector; array; matrix; list; data.frame; factor.
5.1.2 Conversão de tipos de variáveis
Muitas vezes quando importamos os dados para o R, ele os trata como sendo de um tipo diferente do qual desejamos, assim, é preciso convertê-los.
# -- CONVERSAO DE VARIAVEIS --
## alguns exemplos de transformacoes
<- as.double(inteiro) # convertendo para decimal
conv_decimal <- as.integer(decimal) # convertendo para inteiro
conv_inteiro <- as.character(inteiro) # convertendo para caracter conv_caracter
5.1.3 Valores faltantes
Valores faltantes, assim como o próprio nome já diz, são valores ausentes, ou seja, quando você estiver trabalhando com seus dados, talvez você não tenha todos os valores esperados, então você precisa preencher esses “valores faltantes”com a sigla NA, pois o R ao encontrar o NA ele entende que é um valor que está faltando. Abaixo seguem algumas funções para trabalhar com NA.
# -- TRABALHANDO COM VALORES FALTANTES --
## Trabalhando com banco de dados do R
### verificar os bancos de dados data () disponiveis no R
### escolher o banco de dados iris para tralhar
data("iris")
### fazer uma copia do banco de dados
<- iris
data_iris
### remover o banco de dados do ambiente de trabalho
rm(iris)
### estudar o banco de dados
?iris
### verificar o tipo do objeto
class(data_iris)
### "sentindo os dados" - resumo estatistico
summary(data_iris)
### verificar a ocorrencia de NA
#### is.na retorna TRUE caso haja NA (valores não anotados), do contrário retorna FALSE
is.na(data_iris$Sepal.Length)
is.na(data_iris$Sepal.Width)
### verificar se todo o objeto esta preenchido
#### complete.cases retorna TRUE se todos os dados estão preenchidos e FALSE para os faltantes
complete.cases(data_iris$Sepal.Length)
complete.cases(data_iris$Sepal.Width)
## Trabalhando com seus dados (exemplo)
### criando banco de dados
<- data.frame(
coorte barcode = c("A01B1", "A01B2", "A02B3"),
sexo = c("Feminino", "Feminino", NA),
fumante = c(T, F, T),
idade = c(65, 68, 79))
### visualizar os dados
View(coorte)
### "sentindo os dados" - resumo estatistico
summary(coorte)
### vericar o conteudo de NA
is.na(coorte$sexo)
complete.cases(coorte$sexo)
# Perceba que complete.cases e is.na retornam respostas contrários, pois o primeiro verifica se os dados estão preenchidos e o segundo se existem dados faltantes.
### preencher NA com "Não informado"
$sexo[is.na(coorte$sexo)] <- "Não informado"
coorte### verificar se o objeto esta preenchido
complete.cases(coorte$fumante)
5.2 Importação de arquivos
Haverá momentos que precisaremos importar arquivos para o ambiente R e transformá-los em objetos. Antes de importar nossos dados, precisamos executar alguns comandos para averiguar se estamos no diretório correto (onde o arquivo está armazenado), ou seja, confirmar se o arquivo realmente está no diretório.
# -- DIRETORO DE TRABALHO --
## Verificar o diretorio de trabalho
getwd()
## Definir diretorio de trabalho
setwd("caminho/onde/se/encontra/o/arquivo")
## Verificar quais arquivos estao no mesmo diretorio
dir()
Agora iremos utilizar alguns comandos para importar para o ambiente R arquivos com diferentes extensões.
# -- IMPORTACAO DE ARQUIVOS PARA O AMBIENTE R --
<- read.table(file = "ChickWeight.csv", header = T, sep = ",")
input_1 <- read.csv(file = "arquivo(,).csv", header = T)
input_2 <- read.csv2("arquivo(;).csv", header = T) input_3
Agora vamos utilizar a função read_delim() do pacote readr para ler arquivos com diversos tipos de separadores. Por exemplo, vamos importar um arquivo compactado:
# -- IMPORTACAO DE ARQUIVOS COMPACTADOS PARA O AMBIENTE R --
library(readr)
<- read_delim("arquivo.zip", delim = ";") input_zip
Quando não quisermos importar um arquivo inteiro, mas apenas algumas observações (linhas) e variáveis (colunas), faremos da seguinte maneira:
# -- IMPORTACAO DE PARTES DE UM ARQUIVO PARA O AMBIENTE R --
## Vamos importar as quatro primeiras linhas de um arquivo
<- read_delim("arquivo(;).csv", delim = ";", n_max = 4) input_txt_4l
Para importar arquivos do Excel (extensão “xlsx”) utilizaremos o pacote readxl.
# -- IMPORTACAO DE ARQUIVOS DO EXCEL --
<- readxl::read_xlsx("arquivo.xlsx") input_xlsx
5.3 Exportação de arquivos
Para exportar arquivos do ambiente R, para um diretório do seu computador, utilizaremos a função write.table()
. Esta função está contida no pacote base do R, ou seja, esse pacote é instalado no momento em que instalamos o R.
# -- EXPORTACAO DE ARQUIVOS DO AMBIENTE R PARA O UM DIRETORIO NO COMPUTADOR
## Exportando arquivo no diretorio de trabalho
write.csv(input_csv_4l, file = "teste.csv", row.names = F, quote = F)
write.csv2(input_csv_4l, file = "teste2.csv", row.names = F, quote = F)
## Exportando arquivo em um dirtorio especifico
write.csv2(input_csv_4l, file ="~/caminho/do/diretorio/desejado/teste.csv",row.names = F, quote = F)
5.4 Manipulação de dados com pacotes básicos
A manipulação de dados consiste em modificar ou selecionar variáveis de interesse dentro de um conjunto de dados. Nesse exercício, vamos baixar dados de biópsias de nódulos de mama de Wiscosin (W.N. Street, W.H. Wolberg and O.L. Mangasarian, 1993).
# Vamos baixar os dados de características de nódulos de mama de Wiscosin
# Mais informações sobre esse dataset em https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29
download.file(
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/breast-
cancer-wisconsin/wdbc.data',
destfile = "wbdc.data")
# Vamos importar os dados para o ambiente do R.
# Os dados estão separados por vírgula, por isso o argumento sep=','
# outras opções e argumentos podem ser vistos em help(read.table)
<- read.table(file = "./wbdc.data", sep = ',')
brca
# Ver nomes das colunas
colnames(brca)
View(brca)
# Mudar nome da segunda coluna
colnames(brca)[2] <- "Coluna2"
colnames(brca)
# Mudar todos os nomes de colunas conforme descritos no dataset
colnames(brca) <- c('id_number', 'diagnosis', 'radius_mean',
'texture_mean', 'perimeter_mean', 'area_mean',
'smoothness_mean', 'compactness_mean',
'concavity_mean','concave_points_mean',
'symmetry_mean', 'fractal_dimension_mean',
'radius_se', 'texture_se', 'perimeter_se',
'area_se', 'smoothness_se', 'compactness_se',
'concavity_se', 'concave_points_se',
'symmetry_se', 'fractal_dimension_se',
'radius_worst', 'texture_worst',
'perimeter_worst', 'area_worst',
'smoothness_worst', 'compactness_worst',
'concavity_worst', 'concave_points_worst',
'symmetry_worst', 'fractal_dimension_worst')
head(brca)
View(brca)
class(brca)
summary(brca)
Ao observarmos o summary do data frame que criamos, percebemos que a maioria das colunas foram identificadas com valores numéricos, com exceção da coluna ’diagnosis’. Essa coluna foi identificada contendo caracteres e no summary indica 369 caracteres (1 para cada linha). Entretanto, ao observarmos melhor, essa coluna apresenta somente valores de ’B’ para amostras benignas e ’M’ para amostras malignas. Nesse caso, podemos alterá-los para fatores para facilitar o manejo dos dados.
# Acessando o resumo da coluna 'diagnosis' do data frame 'brca'
summary(brca$diagnosis)
# Transformando os valores da coluna em fatores
$diagnosis <- as.factor(brca$diagnosis)
brca
# Agora o summary indica a quantidade de linhas em cada fator. Um resumo que faz mais sentido para nossa análise.
summary(brca$diagnosis)
5.4.1 Acessando e modificando dados
Aqui vamos ver maneiras de acessar, visualizar ou modificar elementos dentro de um data frame. Existe mais de uma forma de realizar as mesmas ações como podemos ver nos exemplos a seguir.
# Acessando itens do data frame
# Visualizando item na 2 linha e 3 coluna
2,3]
brca[
# Mudando valor da 2 linha e 3 coluna
2,3] <- 22
brca[2,3]
brca[
# Visualizando valores da 5 linha
5,]
brca[
# Visualizando valores da 1 à5 linha
1:5,]
brca[
# Visualizando valores da 2 coluna
2]
brca[,
# Visualizando coluna "diagnosis"
$diagnosis
brca
# Visualizando as 2, 3 e 4 colunas
c(2,3,4)]
brca[,
# Visualizando a 2, 3 e 4 colunas e as linhas 2,4,6
c(2,4,6), c(2,3,4)]
brca[
# Visualizando as colunas "diagnosis", "radius_mean" e
# "texture_mean" para as linhas 2,4,6
c(2,4,6), c("diagnosis", "radius_mean", "texture_mean")]
brca[
# Mudando ordem na visualização das colunas
c(2,4,6), c("radius_mean", "diagnosis", "texture_mean")]
brca[
# Excluir 1 coluna
<- brca[,-1]
brca
# Criando novo data frame somente com as colunas de interesse:
<- brca[,c("diagnosis", "radius_mean", "texture_mean",
brca "symmetry_mean", "area_mean", "perimeter_mean")]
# Adicionar coluna com a razão do perímetro pelo raio dos nódulos
$perimeter.radius <- brca$perimeter_mean/brca$radius_mean summary(brca$perimeter.radius)
brca
# Perceba como os valores da razão do perímetro pelo raio dos nódulos se
2*pi (aprox. 6.28) aproxima do valor de
5.4.2 Filtrar observações
Os data frames ou matrizes no R são entendidos como objetos com 2 dimensões, a primeira sendo as observações (linhas) e a segunda as variáveis (colunas). Aqui começaremos tratando de operações com as linhas (observações).
As observações (linhas) do data frame podem ser selecionados de acordo com seus valores ou características. Para isso podemos usar valores lógicos (TRUE or FALSE) ou índices (1,2,3…). Operadores lógicos são úteis para adicionarmos condições a serem cumpridas na seleção dos dados. Na linguagem R, o operador de igual ’=’ se refere a atribuição de valores, assim como ’<-’. Portanto, o operador lógico para igualdade é ’==’. Ele irá testar se o valor à esquerda é igual ao valor da direita, caso positivo retorna TRUE, do contrário FALSE. O operador para diferença é ’!=’, tendo uso análogo. Além disso é possível comparar valores maiores (’>’), menores (’<’), maiores e iguais (’>=’) ou menores e iguais (’<=’).
# Filtrar só amostras benignas
<- brca[brca$diagnosis == "B",]
benign summary(benign)
dim(benign)
# Filtrar só amostras não benignas
<- brca[brca$diagnosis != "B",]
malign summary(malign)
dim(malign)
# Filtrar só tumores com raio maior do 16
<- brca[brca$radius_mean > 16,]
radius16 summary(radius16)
# Filtrar tumores com raio menor ou igual a 16
<- brca[brca$radius_mean <= 16,]
radius.menor16 summary(radius16.menor16)
Além disso, é possível adicionar condições. Por exemplo o operador ’’ (’E’) indica a intersecção de condições, ou seja, a condição1 E a condição2 devem ser atendidas para que o valor retornado seja TRUE. Caso qualquer uma não seja atendida, o teste lógico retorna FALSE.
# Filtrar só tumores com raio maior do que 16 E (&) benignas
<- brca[brca$radius_mean > 16 & brca$diagnosis == "B",]
radius16ebenign summary(radius16ebenign)
á o operador ’|’ (’OU’) indica a união de condições, ou seja, a condição1 OU a condição2, ou ambas podem ser atendidas para que o valor retornado seja TRUE. Nesse caso, o teste lógico só retorna FALSE caso as duas condições NÃO sejam atendidas.
# Filtrar só tumores com raio maior do que 16 ou (|) benignas
<- brca[brca$radius_mean > 16 | brca$diagnosis == "B",]
radius16oubenign summary(radius16oubenign)
5.4.3 Adicionar e ordenar linhas
Por fim, podemos adicionar linhas ao data frame ou mesmo unir dois data frames verticalmente utilizando a função rbind()
(row bind).
# Adicionar linhas, importante ter o mesmo número de variáveis do que o dataframe
<- c("M", 20.5, 21.5, 0.2, 1203, 130.5, 6.6)
novalinha dim(brca)
<- rbind(brca, novalinha)
brca2 dim(brca2)
# Unindo dados de benignos e malignos
<- rbind(benign, malign)
brca2 summary(brca2)
A função order()
retorna o ordenamento dos índices das linhas. Essa função serve justamente para ordenar um objeto de acordo com seu valor. Caso tenha valor numérico, a função ordena do menor para o maior, caso seja uma letra ou palavra, a função ordena em ordem alfabética. O argumento decreasing = T
, oferece a opção de ordenamento decrescente tanto numérico quanto alfabético.
# Ordenar tabela
<- brca[order(brca$radius_mean),]
brca <- brca[order(brca$radius_mean, decreasing = T),]
brca <- brca[order(brca$diagnosis, decreasing = F),] brca
5.4.4 Selecionar colunas, unir data frames horizontalmente e adicionar colunas
De maneira semelhante ao que foi feito com as observações (linhas), aqui podemos selecionar e unir variáveis (colunas). Alguns exemplos já foram mostrados nas seções anteriores. Aqui focaremos em como criar novos data frames com algumas colunas e uni-los com a função cbind()
(column bind).
# Ver dimensões do data frame
dim(brca)
## Cria novo data frame com as 3 primeiras colunas
<- brca[,1:3]
MeiaTabela dim(MeiaTabela)
## Cria novo data frame com as 3 colunas seguintes
<- brca[,4:6]
MeiaTabela2 dim(MeiaTabela2)
## Une as duas tabelas
<- cbind(MeiaTabela, MeiaTabela2)
NovaTabela dim(NovaTabela)
## Adiciona coluna perimeter.radius ao data frame
<- cbind(NovaTabela, brca$perimeter.radius)
NovaTabela2 <- cbind(NovaTabela, perimeter.radius = brca$perimeter.radius) NovaTabela3
5.4.5 Removendo objetos
Os objetos no R são salvos na memória RAM. Ao final da seção, podemos salvar os objetos ou liberar a memória alocada. Entretanto, durante o trabalho podemos limpar o ambiente de trabalho removendo objetos que não serão mais utilizados. Em especial, isso se torna útil quando carregamos data frames muito grandes, os quais podem consumir muito espaço na memória do computador.
# Remover objetos do ambiente de trabalho
rm(NovaTabela, NovaTabela2, NovaTabela3, novalinha,
MeiaTabela, MeiaTabela2, brca2, radius16.benign, radius16ebenign, radius16oubenign)
5.5 Manipulação de dados com tidyverse
Neste tópico vamos trabalhar com funções do pacote dplyr
e tidyr.
A comunidade que trabalha com R conhece bem esses pacotes devido às funções importantes para manipulação de dados que eles contêm. Essencialmente os pacotes dplyr
e tidyr
desempenham as mesmas funções das apresentadas pelas funções básicas. As vantagens se dão em tornar o código mais limpo e legível.
5.5.1 Filtrar observações
A primeira função que utilizaremos é a função filter()
do pacote dplyr
, ela filtra observações.
# -- MANIPULACAO DE DADOS --
## - FILTRAR DADOS -
### Criando banco de dados
<- data.frame(
alunos nome = c("Jean", "Dan", "Pepe", "Bruna", "Rafaela"),
altura = c(1.74, 1.70, 1.73, 1.65, 1.68),
massa = c(69, 66, NA, 55, 53),
sexo = c("masculino", "masculino", "masculino", "feminino", "feminino")
)
### Filtrar dados
library(dplyr)
#### filtrar observacoes com altura maior que 1.7
filter(alunos, altura >= 1.7)
#### filtrar observacoes com altura maior ou igual a 1.68 sendo do sexo
femininofilter(alunos, altura >= 1.68 & sexo == "feminino")
#### filtrar observacoes com altura maior ou igual a 1.68, sendo do sexo
50
feminino e com massa maior que filter(alunos, altura >= 1.68 & sexo == "feminino" & massa > 50)
A função filter()
também está disponível no pacote stats
(um dos pacotes básicos do R), assim, certifique-se que esteja carregando o pacote correto ou utilize a sintaxe dplyr::filter()
para ter certeza de que está usando a função certa.
# -- MANIPULACAO DE DADOS --
## - FILTRAR DADOS -
::filter(alunos, altura > 1.68 & sexo == "feminino") dplyr
5.5.2 Selecionar variáveis
O pacote dplyr disponibiliza a função select(), ela seleciona as variáveis do nosso objeto.
# -- MANIPULACAO DE DADOS --
## - SELECIONAR VARIAVEIS -
### selecionar as colunas: nomes, sexo, massa
select(alunos, nomes, sexo, massa)
### selecionar as colunas que terminam com o caracter: "a"
select(alunos, ends_with("a"))
### selecionar as colunas que contêm a sequência de caracteres: "no"
select(alunos, contains("no"))
### selecionar as colunas: 2, 3 e 4
select(alunos, 2:4)
### visualizar todas as linhas e as colunas 1, 2 e 3
1:3]
alunos[,
### visuzalizar todas as linhas e as colunas 1, 4 e 3
c(1,4,3)] alunos[,
5.5.3 Modificação de dados
Utilizando o mesmo exemplo, vamos criar uma coluna com o nome de imc e colocarmos o resultado do cálculo nessa coluna.
# -- MANIPULACAO DE DADOS --
## - INSERIR UMA COLUNA NO CONJUNTO DE DADOS -
### inserir uma coluna nos conjunto de dados com o resultado do imc de cada
aluno<- mutate(alunos, imc = (peso/(altura)^2)) alunos_2
5.5.4 Renomeando variáveis
Que tal renomear o nome de alguma variável? Podemos renomear nossas variáveis utilizando a função rename()
que também é do pacote dplyr
.
# -- MANIPULACAO DE DADOS --
## - RENOMEAR UMA COLUNA DO CONJUNTO DE DADOS-
### renomear as colunas: altura para altura.m e massa para massa.kg
<- rename(alunos,
alunos altura.m = altura,
massa.kg = massa)
5.5.5 Uso de pipes
Quando queremos fazer operações múltiplas em sequência, podemos utilizar o pipe (%>%), ele pertence ao pacote magrittr. O uso de pipes serve para simplificar o código. Supondo que precisamos selecionar, sumarizar e plotar alguns dados, podemos fazer comandos para cada execução, porém fica confuso porque temos que executar um de cada vez. Com o uso de pipes colocamos um comando em sequência do outro e o resultado de um comando serve como entrada para o outro comando.
# -- MANIPULACAO DE DADOS --
## - USO DE PIPES -
### Sem pipes
select(filter(alunos_2, imc >= 23), nome, massa)
### Com pipes
%>%
alunos_2 filter(imc >= 23) %>%
select(nome, massa, imc)
#### a media das massas e o somatorio das massas separando por sexo
%>%
alunos_2 group_by(sexo) %>%
summarise(media = mean(massa),
somatorio = sum(massa))
#### a media, desvio padrao e quantidade das massas separando por sexo
%>%
alunos_2 group_by(sexo) %>%
summarise(media = mean(massa),
sd.massa = sd(massa),
total.massa = n())
#### a media, desvio padrao e quantidade das massas separando por sexo
%>%
alunos group_by(sexo) %>%
summarise(media = mean(massa, na.rm = TRUE),
sd.massa = sd(massa, na.rm = T),
total.massa = n())
5.5.6 Ordenar dados
Há momentos em que precisaremos ordenar nossos dados, para termos uma melhor visualização facilitando nossas análises. Para ordenar os dados utilizaremos a função arrange()
do pacote dplyr
.
# -- MANIPULACAO DE DADOS --
## - ORDENAR DADOS -
### ordenando de forma decrescente o objeto "alunos" atraves da variavel massa
%>%
alunos arrange(desc(massa))
### agrupando por sexo e ordenando pela massa
%>%
alunos group_by(sexo) %>%
arrange(desc(massa), .by_group = TRUE)
#### ---- note que informei ".by_grupo = TRUE" para poder ordenar primeiro o "
" e depois o "masculino" ---- feminino
5.5.7 Combinar variáveis
Quando quisermos combinar variáveis podemos utilizar a função bind_cols()
.
# -- MANIPULACAO DE DADOS --
## - COMBINAR VARIAVEIS -
### criar conjunto de dados para combinar
<- data.frame(
complemento nome = c("Jean", "Dan", "Pepe", "Bruna", "Rafaela"),
tipo.sang = c("A+", "A+", "B-", "B+","B-"))
### combinando objetos
bind_cols(alunos, complemento)
Unir variáveis à esquerda (left jooin) Neste caso não é necessário ter o mesmo número de observações, uma vez que serão unidos somente os objetos que contém a mesma chave.
# -- MANIPULACAO DE DADOS --
## - UNIR VARIAVEIS A ESQUERDA -
### criar conjunto de dados para combinar
<- data.frame(
complemento_1 nome = c("Dan", "Pepe"),
estado = c("PR", "SC"))
### combinando objetos
left_join(alunos, complemento_1)
Unir variáveis à direita (right join) Vamos unir observações que correspondem à objetos a direita. Para unir objetos cuja variável de um seja diferente da variável do outro basta informar ao comando.
# -- MANIPULACAO DE DADOS --
## - UNIR VARIAVEIS A DIREITA -
### criar conjunto de dados para combinar
<- data.frame(
alunos_4 aluno = c("Jean", "Tamara", "Rafaela"),
cid.natal = c("Umuarama-PR", "Curitiba-PR", "Maringa-PR"))
### unindo o objeto da direita ao da esquerda considerando que as variaveis
nome e aluno sao as mesmasright_join(alunos_4, alunos, by = c("aluno" = "nome"))
Unir variáveis internamente (inner join)
Diversas vezes queremos unir bancos de dados incompletos, assim, podemos utilizar a função inner_join()
, ela irá desconsiderar as observações que não possuem todas as variáveis completas.
# -- MANIPULACAO DE DADOS --
## - UNIR VARIAVEIS INTERNAMENTE -
### unindo objetos considerando que as variaveis nome e aluno sao as mesmas
inner_join(alunos_4, alunos, by = c("aluno" = "nome"))
Unir todas as observações dos objetos (full join)
Se desejamos unir todas as observações de dois objetos podemos utilizar a função full_join()
.
# -- MANIPULACAO DE DADOS --
## - UNIR TODAS AS VARIAVEIS -
### unindo objetos considerando que as variaveis nome e aluno sao as mesmas
full_join(alunos_4, alunos, by = c("aluno" = "nome"))
Semi join e anti join
Se desejamos saber quais observações de um objeto possuem correspondências em outro objeto podemos fazer uso da função semi_join()
.
# -- MANIPULACAO DE DADOS --
## - MESMAS CORRESPONDENCIAS -
### criar um novo conjunto de dados.
<- left_join(complemento_1, alunos)
alunos_5
### verificar observacoes de "alunos" que possuem correspondencias com
"alunos.5".
observacoes com semi_join(alunos, alunos_5)
Porém, se desejamos saber quais observações não possuem correspondências em outro objeto podemos fazer uso da função anti_join()
.
# -- MANIPULACAO DE DADOS --
## - CORRESPONDENCIAS DIFERENTES -
### verificar observacoes de "alunos" que nao possuem correspondencias com observacoes de "alunos.5"
anti_join(alunos, alunos_5)
Se quisermos distinguir os dados, ou seja, quais observações são de um grupo A e quais são de um grupo B, podemos criar uma lista com os objetos, nomear cada um dos elementos da lista e em seguida unir com a função bind_rows()
definindo o argumento “.id”.
# -- MANIPULACAO DE DADOS --
## - SEPARAR EM GRUPOS -
### exemplo 01
.1 <- list(alunos_5, alunos)
listanames(lista.1) <- c("A", "B")
.1
lista
### exemplo 02
bind_rows(lista.1, .id = "turma")
Pivot wider e pivot longer
Duas funções que podem parecer um pouco difíceis de utilizar em um primeiro momento, mas são bastante úteis em determinadas situações são pivot wider()
e pivot longer()
. Como o nome sugere, a função pivot wider()
“alonga”seus dados no sentido horizontal. Ou seja, ela vai distribuir os valores alocados nas linhas dentro de várias variáveis. Na prática, ela diminui o número de linhas do seu data frame distribuindo em mais colunas. A função pivot longer()
faz o oposto, ela une variáveis (colunas) dentro de uma ou mais colunas pivôs, repetindo os demais valores. Na prática, ela aumenta o número de linhas e diminui o de colunas. Essa função é especialmente útil no manejo de dados para a construção de boxplots (veremos adiante).
Utilizaremos as 10 primeiras linhas do data set com informações da quantidade de cartões que cada jogador levou na Copa do Mundo de 2018.
# pivot_wider e longer
# 10 primeiras linhas da tabela de cartões por jogador da Copa do Mundo de 2018
# https://pt.wikipedia.org/wiki/Dados_disciplinares_da_Copa_do_Mundo_FIFA_de_2018
<- data.frame(
df stringsAsFactors = FALSE,
Jogador = c("Carlos Sánchez","Michael Lang","Igor Smolnikov","Jérôme Boateng",
"Sebastian Larsson","Aleksandar Mitrovi","Ante Rebi",
"Armando Cooper","Blaise Matuidi","Casemiro"),
Selecao = c("Colômbia","Suíça","Rússia","Alemanha","Suécia","Sérvia","Croácia",
"Panamá","França","Brasil"),
Cartao.Amarelo = c(1L, 0L, 0L, 0L, 3L, 2L, 2L, 2L, 2L, 2L),
Cartao.Amarelo.Vermelho = c(0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L),
Cartao.Vermelho = c(1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L))
# Vamos escolher as colunas pivôs, que nesse caso serão as 3 colunas com as quantidades de cada cartão que os jogadores receberam.
# A opção names_to se refere a coluna que será gerada com os nomes das colunas pivos e values_to éo nome da coluna que será gerada com os valores.
dim(df)
<-
df_longer ::pivot_longer(
tidyrdata = df,
names_to = "Cartao",
values_to = "Qtde",
cols = c("Cartao.Amarelo","Cartao.Amarelo.Vermelho","Cartao.Vermelho"))
dim(df_longer)
# O pivot_wider faz a operação contrária, escolhemos de onde virão os nomes das novas colunas (names_from) e de onde virão os valores a serem preenchidos (values_from)
<-
df_wider ::pivot_wider(
tidyrdata = df_longer,
names_from = c("Cartao"),
values_from = c("Qtde"))
dim(df_wider)
5.6 Lista de exercícios
- Utilizando o data frame “trees” responda as seguintes questões:
- Qual a dimensão do objeto “trees”?
- Alguma variável possui valores ausentes?
- Existe alguma variável do tipo “caracter”?
- Qual a média de cada variável?
- Qual o mínimo e máximo de cada variável?
- Na descrição desse data set qual a unidade de cada coluna? Metros, pés, polegadas?
- Para esse exercício considere 1 polegada = 0.0254 metros e 1 pé = 0.3048 metros e 1 pé³ = 0.028317 metros cúbicos.Faça as seguintes alterações:
- Passe os valores da variável “Girth” para metros.
- Passe os valores da variável “Height” para metros.
- Passe os valores da variável “Volume” para m³.
- Filtre a tabela para somente observações com altura acima de 23m. Quantas observações sobraram?
- Exporte esse conjunto de dados para o seu diretório de trabalho