Introdução à manipulação de dados no R usando os pacotes data.table e dplyr

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 (pense data.table como uma versão avançada do data.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
  • dplyr
    • Descrição: é um pacote do R com proposta similar ao data.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 pacote base e ao data.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 formato data.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

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]

  1. DT – referência a tabela de dados;
  2. i <=> where – referência a indexação da linha, subconjunto de linhas a ser selecionadas;
  3. j <=> select – referência a indexação da coluna, colocar as condições (para filtrar, para resumir) em colunas aqui;
  4. 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
comments powered by Disqus