Rumenick Pereira da Silva | 09/09/2016
Introdução
Neste post trataremos de manipulação de dados usando os pacotes data.table
e dplyr
. Nosso objetivo é fazer uma breve introdução às principais funções de ambos pacotes. Além disso, destacaremos algumas vantagens e desvantagens de utilizar um ou o outro. Nos exemplos apresentaremos os códigos para os 2 pacotes simultaneamente, para que fique claro a diferença entre as sintaxes desses pacotes.
Provavelmente se você encontrou esse post é por que você já sabe que os pacotes data.table
e dplyr
são os pacotes do “momento” para manipulação de dados no R
. Porém, se você nunca ouviu falar sobre eles, segue uma breve descrição:
data.table
- Descrição: é um pacote do
R
que fornece uma versão melhorada de data.frames (pensedata.table
como uma versão avançada dodata.frame
), bem como um conjunto de ferramentas para dividir, aplicar e combinar dados. Além disso o pacote disponibiliza uma função muito eficaz para importação de dados em diversos formatos. Tudo isso com baixo tempo de processamento e uso eficiente da memória (neste caso memória RAM). Para saber mais consulte a página do pacote no github e (ou) no CRAN. - Autores: Matt Dowle e Arun Srinivasan
- Descrição: é um pacote do
dplyr
- Descrição: é um pacote do
R
com proposta similar aodata.table
, porém este é voltado principalmente para manipulação de dados (a mesma ideia de dividir, aplicar e combinar). Destaca-se também que esse pacote tem uma sintaxe relativamente intuitiva, quando comparado ao pacotebase
e aodata.table
. Apesar de não ter uma função diretamente para importação de dados, possui compatibilidade com a maioria dos recursos de importação de dados que retornam o formatodata.frame
, podendo estar na memória RAM ou não. Para saber mais consulte a página do pacote no github e (ou) no CRAN. - Autores: Hadley Wickham, Romain Francois e RStudio
- Descrição: é um pacote do
Com a popularização desses pacotes observou-se um aumento do interesse dos usuários em saber até que ponto o data.table
tem melhor performace que o dplyr
e vice-versa. Logo, é possível encontrar alguns estudos de simulação comparando esses pacotes segundo os quesitos: tempo de processamento, uso de memória, sintaxe e recursos (veja aqui uma discursão sobre data.table
vs dplyr
). Em linhas gerais os resultados mostram que em todos os quesitos o data.table
é melhor ou equivalente ao dplyr
nas situações consideradas. Contudo, percebe-se que muitos dos participantes da discussão não cheragaram a um consenso.
Na minha opinião, se você precisa realizar manipulação de conjuntos de dados relativamente pequenos, eu o acoselharia a usar o dplyr
(a linha de apredizado é relativamente mais rápida), caso contrário vale apena investir no data.table
. Deve-se ressaltar que o data.table
carrega todos os dados na memória, já o dplyr
tem suporte para dados carregados na memória ou não, o que é um argumento forte.
Usando os pacotes data.table e dplyr
Inicialmente carregaremos os pacotes data.table
(versão 1.9.6) e dplyr
(versão 0.5.0). Segue o código:
# Instalando pacotes:
# install.packages("data.table")
# install.packages("dplyr")
# Carregado pacotes:
require(data.table)
require(dplyr)
Para ilustrar o uso dos pacotes supracitados foi considerado o conjunto de dados iris
do pacote data.sets
. Os camandos que seguem carrega e converte esse conjunto de dados que está no formato data.frame
para o formato data.table
e dplyr
. Observe que por padrão o formato data.frame
imprime todos os dados no arquivo, enquanto que os formatos data.table
e tbl
como foram projetados para grandes conjuntos de dados, e imprime apenas uma parcela das linhas. Porém, se o conjunto de dados tiver até 100 linhas, por padrão a classe data.table
vai imprimir todo o conjunto de dados. Além disso, note que os objetos DT
e DF
também possuem a classe data.frame
, isso para manter a compatibilidade com outras funções dos demais pacotes.
# Carregando conjunto de dados:
data("iris")
iris
## 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
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 11 5.4 3.7 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 24 5.1 3.3 1.7 0.5 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 42 4.5 2.3 1.3 0.3 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 50 5.0 3.3 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 53 6.9 3.1 4.9 1.5 versicolor
## 54 5.5 2.3 4.0 1.3 versicolor
## 55 6.5 2.8 4.6 1.5 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 57 6.3 3.3 4.7 1.6 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 59 6.6 2.9 4.6 1.3 versicolor
## 60 5.2 2.7 3.9 1.4 versicolor
## 61 5.0 2.0 3.5 1.0 versicolor
## 62 5.9 3.0 4.2 1.5 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 66 6.7 3.1 4.4 1.4 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 68 5.8 2.7 4.1 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 74 6.1 2.8 4.7 1.2 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 78 6.7 3.0 5.0 1.7 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 80 5.7 2.6 3.5 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 86 6.0 3.4 4.5 1.6 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 94 5.0 2.3 3.3 1.0 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 96 5.7 3.0 4.2 1.2 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 101 6.3 3.3 6.0 2.5 virginica
## 102 5.8 2.7 5.1 1.9 virginica
## 103 7.1 3.0 5.9 2.1 virginica
## 104 6.3 2.9 5.6 1.8 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 107 4.9 2.5 4.5 1.7 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 110 7.2 3.6 6.1 2.5 virginica
## 111 6.5 3.2 5.1 2.0 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 115 5.8 2.8 5.1 2.4 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 117 6.5 3.0 5.5 1.8 virginica
## 118 7.7 3.8 6.7 2.2 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 120 6.0 2.2 5.0 1.5 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 124 6.3 2.7 4.9 1.8 virginica
## 125 6.7 3.3 5.7 2.1 virginica
## 126 7.2 3.2 6.0 1.8 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 130 7.2 3.0 5.8 1.6 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 132 7.9 3.8 6.4 2.0 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 134 6.3 2.8 5.1 1.5 virginica
## 135 6.1 2.6 5.6 1.4 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 137 6.3 3.4 5.6 2.4 virginica
## 138 6.4 3.1 5.5 1.8 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 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
# Convertendo para data.table
DT <- data.table(iris)
DT
## 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
## ---
## 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
class(DT)
## [1] "data.table" "data.frame"
# Convertendo para tbl (formato dplyr)
DF <- as_data_frame(iris)
DF
## # A tibble: 150 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fctr>
## 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
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## # ... with 140 more rows
class(DF)
## [1] "tbl_df" "tbl" "data.frame"
Agora obordaremos, primeiramente, a sintaxe geral do data.table
e na sequência destacaremos as principais funções do pacote dplyr
.
- Sintaxe geral do
data.table
:
DT[i, j, by]
DT
– referência a tabela de dados;i <=> where
– referência a indexação da linha, subconjunto de linhas a ser selecionadas;j <=> select
– referência a indexação da coluna, colocar as condições (para filtrar, para resumir) em colunas aqui;by <=> group_by
– referência a indexação da variável categórica a qual você deseja agrupar os dados.
Principais funções do
dplyr
:filter
: filtra um data.frame com vetores lógicos. Em outras palavras, deixa apenas as linhas que satisfazem certo critério;select
: seleciona uma ou mais colunas de um data.frame;arrange
: orderna o data.frame com base em uma coluna;mutate
: cria uma nova coluna;group_by
: agrupa um data.frame segundo um vetor de categorias. “Agrupar” aqui quer dizer que todas as operações subsequentes serão feitas separadas por grupos;summarise
: transforma um vetor com vários números em um único número de acordo com uma função.
Observação: O dplyr foi projetado para trabalhar com o operador pipe %>%
do pacote magritrr
. Basicamente o operador faz com que você possa escrever sintaxe do tipo x %>% f() ao invés de f(x).
A seguir são apresentados alguns exemplos de manipulações de dados com o base
, data.table
e dplyr
usando a base de dados iris
.
Filtrando: obtendo subconjunto de linhas e (ou) colunas
Caso 1:
Instruções: Queremos todas as flores da espécie setosa que tenham o tamanho da sépala entre 4.8 e 5.1.
# base
iris[iris$Species == "setosa" & iris$Sepal.Length > 4.8 & iris$Sepal.Length < 5.1, ]
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 2 4.9 3.0 1.4 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 50 5.0 3.3 1.4 0.2 setosa
# data.table
DT[Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1, , ]
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1: 4.9 3.0 1.4 0.2 setosa
## 2: 5.0 3.6 1.4 0.2 setosa
## 3: 5.0 3.4 1.5 0.2 setosa
## 4: 4.9 3.1 1.5 0.1 setosa
## 5: 5.0 3.0 1.6 0.2 setosa
## 6: 5.0 3.4 1.6 0.4 setosa
## 7: 4.9 3.1 1.5 0.2 setosa
## 8: 5.0 3.2 1.2 0.2 setosa
## 9: 4.9 3.6 1.4 0.1 setosa
## 10: 5.0 3.5 1.3 0.3 setosa
## 11: 5.0 3.5 1.6 0.6 setosa
## 12: 5.0 3.3 1.4 0.2 setosa
# dplyr
DF %>%
filter(Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1)
## # A tibble: 12 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fctr>
## 1 4.9 3.0 1.4 0.2 setosa
## 2 5.0 3.6 1.4 0.2 setosa
## 3 5.0 3.4 1.5 0.2 setosa
## 4 4.9 3.1 1.5 0.1 setosa
## 5 5.0 3.0 1.6 0.2 setosa
## 6 5.0 3.4 1.6 0.4 setosa
## 7 4.9 3.1 1.5 0.2 setosa
## 8 5.0 3.2 1.2 0.2 setosa
## 9 4.9 3.6 1.4 0.1 setosa
## 10 5.0 3.5 1.3 0.3 setosa
## 11 5.0 3.5 1.6 0.6 setosa
## 12 5.0 3.3 1.4 0.2 setosa
Caso 2:
Instruções: Queremos todas as flores da espécie setosa que tenham o tamanho da sépala entre 4.8 e 5.1. Porém, só estamos interessados nas variáveis tamanho da sépala (Sepal.Length
) e tamanho da pétala (Petal.Length
).
# base
iris[iris$Species == "setosa" & iris$Sepal.Length > 4.8 & iris$Sepal.Length < 5.1, c("Sepal.Length", "Petal.Length")]
## Sepal.Length Petal.Length
## 2 4.9 1.4
## 5 5.0 1.4
## 8 5.0 1.5
## 10 4.9 1.5
## 26 5.0 1.6
## 27 5.0 1.6
## 35 4.9 1.5
## 36 5.0 1.2
## 38 4.9 1.4
## 41 5.0 1.3
## 44 5.0 1.6
## 50 5.0 1.4
# Forma alternantiva:
# iris[iris$Species == "setosa" & iris$Sepal.Length > 4.8 & iris$Sepal.Length < 5.1, c(1, 3)]
# data.table
DT[Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1, .(Sepal.Length, Petal.Length), ]
## Sepal.Length Petal.Length
## 1: 4.9 1.4
## 2: 5.0 1.4
## 3: 5.0 1.5
## 4: 4.9 1.5
## 5: 5.0 1.6
## 6: 5.0 1.6
## 7: 4.9 1.5
## 8: 5.0 1.2
## 9: 4.9 1.4
## 10: 5.0 1.3
## 11: 5.0 1.6
## 12: 5.0 1.4
# Forma alternantiva:
# DT[Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1, list(Sepal.Length, Petal.Length), ]
# dplyr
DF %>%
filter(Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1) %>%
select(Sepal.Length, Petal.Length)
## # A tibble: 12 × 2
## Sepal.Length Petal.Length
## <dbl> <dbl>
## 1 4.9 1.4
## 2 5.0 1.4
## 3 5.0 1.5
## 4 4.9 1.5
## 5 5.0 1.6
## 6 5.0 1.6
## 7 4.9 1.5
## 8 5.0 1.2
## 9 4.9 1.4
## 10 5.0 1.3
## 11 5.0 1.6
## 12 5.0 1.4
# Forma alternantiva:
# DF %>%
# filter(Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1) %>%
# select(ends_with("Length"))
Ordenando: linhas ordenadas segundo um variável
Caso 3:
Instruções: Queremos todas as flores da espécie setosa que tenham o tamanho da sépala entre 4.8 e 5.1. Porém, só estamos interessados nas variáveis tamanho da sépala (Sepal.Length
) e tamanho da pétala (Petal.Length
). Além disso, desejamos que os dados sejam ordenados segundo o tamanho da pétala.
# base
DFbase <- iris[iris$Species == "setosa" &
iris$Sepal.Length > 4.8 &
iris$Sepal.Length < 5.1,
c("Sepal.Length", "Petal.Length")]
# Crescente:
DFbase[order(DFbase$Petal.Length), ]
## Sepal.Length Petal.Length
## 36 5.0 1.2
## 41 5.0 1.3
## 2 4.9 1.4
## 5 5.0 1.4
## 38 4.9 1.4
## 50 5.0 1.4
## 8 5.0 1.5
## 10 4.9 1.5
## 35 4.9 1.5
## 26 5.0 1.6
## 27 5.0 1.6
## 44 5.0 1.6
# Decrescente:
DFbase[order(DFbase$Petal.Length, decreasing = TRUE), ]
## Sepal.Length Petal.Length
## 26 5.0 1.6
## 27 5.0 1.6
## 44 5.0 1.6
## 8 5.0 1.5
## 10 4.9 1.5
## 35 4.9 1.5
## 2 4.9 1.4
## 5 5.0 1.4
## 38 4.9 1.4
## 50 5.0 1.4
## 41 5.0 1.3
## 36 5.0 1.2
# data.table
DTorder <- DT[Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1, .(Sepal.Length,Petal.Length), ]
# Crescente:
DTorder[order(Petal.Length), ,]
## Sepal.Length Petal.Length
## 1: 5.0 1.2
## 2: 5.0 1.3
## 3: 4.9 1.4
## 4: 5.0 1.4
## 5: 4.9 1.4
## 6: 5.0 1.4
## 7: 5.0 1.5
## 8: 4.9 1.5
## 9: 4.9 1.5
## 10: 5.0 1.6
## 11: 5.0 1.6
## 12: 5.0 1.6
# Decrescente:
DTorder[order(Petal.Length, decreasing = TRUE), ,]
## Sepal.Length Petal.Length
## 1: 5.0 1.6
## 2: 5.0 1.6
## 3: 5.0 1.6
## 4: 5.0 1.5
## 5: 4.9 1.5
## 6: 4.9 1.5
## 7: 4.9 1.4
## 8: 5.0 1.4
## 9: 4.9 1.4
## 10: 5.0 1.4
## 11: 5.0 1.3
## 12: 5.0 1.2
# dplyr
# Crescente:
DF %>%
filter(Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1) %>%
select(Sepal.Length, Petal.Length) %>%
arrange(Petal.Length)
## # A tibble: 12 × 2
## Sepal.Length Petal.Length
## <dbl> <dbl>
## 1 5.0 1.2
## 2 5.0 1.3
## 3 4.9 1.4
## 4 5.0 1.4
## 5 4.9 1.4
## 6 5.0 1.4
## 7 5.0 1.5
## 8 4.9 1.5
## 9 4.9 1.5
## 10 5.0 1.6
## 11 5.0 1.6
## 12 5.0 1.6
# Decrescente:
DF %>%
filter(Species == "setosa" & Sepal.Length > 4.8 & Sepal.Length < 5.1) %>%
select(Sepal.Length, Petal.Length) %>%
arrange(desc(Petal.Length))
## # A tibble: 12 × 2
## Sepal.Length Petal.Length
## <dbl> <dbl>
## 1 5.0 1.6
## 2 5.0 1.6
## 3 5.0 1.6
## 4 5.0 1.5
## 5 4.9 1.5
## 6 4.9 1.5
## 7 4.9 1.4
## 8 5.0 1.4
## 9 4.9 1.4
## 10 5.0 1.4
## 11 5.0 1.3
## 12 5.0 1.2
Criando e modificando: adicionar novas variáveis ao conjunto de dados
Caso 4:
Instruções: Adicione a variável dimensão da flor ao conjunto de dados (nomeada de Dim
). Essa variável é dada pela razão entre o tamanho da sépala e o tamanho da pétala.
# base
iris$Dim <- iris$Sepal.Length/iris$Petal.Length
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species Dim
## 1 5.1 3.5 1.4 0.2 setosa 3.642857
## 2 4.9 3.0 1.4 0.2 setosa 3.500000
## 3 4.7 3.2 1.3 0.2 setosa 3.615385
## 4 4.6 3.1 1.5 0.2 setosa 3.066667
## 5 5.0 3.6 1.4 0.2 setosa 3.571429
## 6 5.4 3.9 1.7 0.4 setosa 3.176471
# Forma alternativa:
# iris <- transform(iris, Dim = Sepal.Length/Petal.Length)
# head(iris)
# data.table (Alocação por referência)
DT[ , Dim := Sepal.Length/Petal.Length, ]
# dplyr
DF <- DF %>% mutate(Dim = Sepal.Length/Petal.Length)
DF
## # A tibble: 150 × 6
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species Dim
## <dbl> <dbl> <dbl> <dbl> <fctr> <dbl>
## 1 5.1 3.5 1.4 0.2 setosa 3.642857
## 2 4.9 3.0 1.4 0.2 setosa 3.500000
## 3 4.7 3.2 1.3 0.2 setosa 3.615385
## 4 4.6 3.1 1.5 0.2 setosa 3.066667
## 5 5.0 3.6 1.4 0.2 setosa 3.571429
## 6 5.4 3.9 1.7 0.4 setosa 3.176471
## 7 4.6 3.4 1.4 0.3 setosa 3.285714
## 8 5.0 3.4 1.5 0.2 setosa 3.333333
## 9 4.4 2.9 1.4 0.2 setosa 3.142857
## 10 4.9 3.1 1.5 0.1 setosa 3.266667
## # ... with 140 more rows
Caso 5:
Instruções: Padronize a variável Dim
# base
iris$Dim <- (iris$Dim - mean(iris$Dim)) / sd(iris$Dim)
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species Dim
## 1 5.1 3.5 1.4 0.2 setosa 1.5304954
## 2 4.9 3.0 1.4 0.2 setosa 1.3959303
## 3 4.7 3.2 1.3 0.2 setosa 1.5046175
## 4 4.6 3.1 1.5 0.2 setosa 0.9877497
## 5 5.0 3.6 1.4 0.2 setosa 1.4632129
## 6 5.4 3.9 1.7 0.4 setosa 1.0911801
# Forma alternativa:
# iris <- transform(iris, Dim = Sepal.Length/Petal.Length)
# head(iris)
# data.table (Alocação por referência)
DT[ , Dim := (Dim - mean(Dim)) / sd(Dim), ]
# dplyr
DF <- DF %>% mutate(Dim = (Dim - mean(Dim)) / sd(Dim))
DF
## # A tibble: 150 × 6
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species Dim
## <dbl> <dbl> <dbl> <dbl> <fctr> <dbl>
## 1 5.1 3.5 1.4 0.2 setosa 1.5304954
## 2 4.9 3.0 1.4 0.2 setosa 1.3959303
## 3 4.7 3.2 1.3 0.2 setosa 1.5046175
## 4 4.6 3.1 1.5 0.2 setosa 0.9877497
## 5 5.0 3.6 1.4 0.2 setosa 1.4632129
## 6 5.4 3.9 1.7 0.4 setosa 1.0911801
## 7 4.6 3.4 1.4 0.3 setosa 1.1940828
## 8 5.0 3.4 1.5 0.2 setosa 1.2389378
## 9 4.4 2.9 1.4 0.2 setosa 1.0595177
## 10 4.9 3.1 1.5 0.1 setosa 1.1761407
## # ... with 140 more rows
Caso 6:
Instruções: Deletar a variável Dim
# base
iris$Dim <- NULL
head(iris)
## 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
# data.table (Alocação por referência)
DT[ , Dim := NULL, ]
# dplyr
DF <- DF %>% select(-Dim)
DF
## # A tibble: 150 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fctr>
## 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
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## # ... with 140 more rows
Resumindo: resumo de dados por grupos
Caso 7:
Instruções: obtenha a média e o desvio-padrão do tamanho da sépala segundo a espécie da flor.
# base
lapply(split(iris$Sepal.Length, iris$Species), mean)
## $setosa
## [1] 5.006
##
## $versicolor
## [1] 5.936
##
## $virginica
## [1] 6.588
lapply(split(iris$Sepal.Length, iris$Species), sd)
## $setosa
## [1] 0.3524897
##
## $versicolor
## [1] 0.5161711
##
## $virginica
## [1] 0.6358796
# data.table (Alocação por referência)
DT[ , .(medsep = mean(Sepal.Length), sdsep = sd(Sepal.Length)), by = Species]
## Species medsep sdsep
## 1: setosa 5.006 0.3524897
## 2: versicolor 5.936 0.5161711
## 3: virginica 6.588 0.6358796
# dplyr
DF %>%
group_by(Species) %>%
summarise(medsep = mean(Sepal.Length), sdsep = sd(Sepal.Length))
## # A tibble: 3 × 3
## Species medsep sdsep
## <fctr> <dbl> <dbl>
## 1 setosa 5.006 0.3524897
## 2 versicolor 5.936 0.5161711
## 3 virginica 6.588 0.6358796