data.table est un package qui facilite et accélère les opérations de filtrage, création et mises à jours de variables et d'agrégation d'un tableau de donénes.
3. data.frame et data.table
• Un «data.table» est un «data.frame» avec des
fonctionnalités additionnelles
• Plus lisible, plus compréhensible, plus
compact, plus rapide…
• Efficient
3
4. data.table et SQL
• Semblable à du SQL (possibilité de définir des
clefs)
• Permet de réaliser des requêtes dans un
tableau mais avec la syntaxe de R :
data[<where>, <select>, <group by>]
4
5. Exemple selection
# installation de la librairie
install.packages("data.table")
# chargement de la librairie
library(data.table)
# chargement des données
load("C:/Users/Ve/Desktop/Raddicts/pokemon.rda")
5
6. Exemple selection
# 1. Selectionner : data.frame et data.table #############
# details / conversions :
class(data)
dfPokemon <- data
dtPokemon <- data.table(data)
class(dfPokemon)
class(dtPokemon)
# # details sur les données :
# dfPokemon
# dtPokemon
6
7. Exemple selection
# selectionnner le nom des pokemons avec des caracteristiques particulières :
# avec un data frame
dfPokemon[(dfPokemon$Attack - dfPokemon$Defense) > 10 &
dfPokemon$Speed > 120 & dfPokemon$LastEvolution, ]$Name
dfPokemon[(dfPokemon$Attack - dfPokemon$Defense) > 10 &
dfPokemon$Speed > 120 & dfPokemon$LastEvolution, c("Name", "HP")]
# avec un data table
dtPokemon[Attack - Defense > 10 & Speed > 120 & LastEvolution, Name]
dtPokemon[Attack - Defense > 10 & Speed > 120 & LastEvolution,
list(Name,HP)]
7
9. Filtrer
• Garder les lignes qui nous intéresse :
– Soit avec une clause
– Soit avec une clef (ou plusieurs clefs)
• data[ <where>, <select>, <group by>]
• Plus rapide avec des clefs (ne parcourt pas
toutes les lignes d’un tableau)
9
10. Exemple de filtres
# 2. Filtrer des observations ####
# avec un data frame
dfPokemon[(dfPokemon$Attack - dfPokemon$Defense) > 10 & dfPokemon$Speed >
120 & dfPokemon$LastEvolution, ]
# avec un data table
dtPokemon[Attack - Defense > 10 & Speed > 120 & LastEvolution]
# Filtrer les noms des pokemon commencant par la lettre "A" :
# avec un data frame
dfPokemon[ grep("^A",dfPokemon$Name), ]
# avec un data table
dtPokemon[ Name %like% "^A" ]
10
11. Exemple de filtres
## 3. Filtrer des observations avec clefs ####
# définir une clef :
setkey(dtPokemon,LastEvolution)
dtPokemon[J(TRUE)]
# définir deux clefs :
setkey(dtPokemon, Attack, LastEvolution)
dtPokemon[J(c(110:120),TRUE)]
11
12. Grouper
• Sélectionner, filtrer, calculer par groupe
(calculer des statistiques agrégées…)
data[<where>, <select>, by = <group>]
12
13. .SD et .N
• En groupant, on peut utiliser des « objets
spéciaux » dans le select :
– Pour chaque groupe, ".SD" est la partie du tableau
qui correspond à ce groupe. C’est aussi un
data.table et on peut lui appliquer une fonction
arbitraire
– .N nombre d’observations dans chaque groupe
.N = nrow(.SD)
13
14. Exemple d’opérations par groupe
# calculer une moyenne
dtPokemon[ , mean(Speed), by = LastEvolution]
# calculer une moyenne et renommer la statistique calculée
dtPokemon[ , list( vitesseMoyenne = mean(Speed) ), by = LastEvolution]
# calculer une moyenne en créant une variable de groupe
dtPokemon[ , mean(Speed), by = list(LastEvolution, aName = Name %like% "^A" )]
# ordonner les valeurs par le keyby
dtPokemon[ , mean(Speed), keyby = list(LastEvolution, aName = Name %like% "^A" )]
14
15. Exemple d’opérations par groupe
# faire des opérations par groupe avec .SD et .N :
dtPokemon[, nrow(.SD) , by = LastEvolution]
# ou
dtPokemon[,.N, by =LastEvolution]
# sélectioner le pokemon le plus rapide pour les deux catégories
d'évolution
dtPokemon[, .SD[which.max(Speed)] , by = LastEvolution]
15
16. Mettre à jours des observations
• Opérateur « := » pour :
– Créer des variables
– Modifier des variables
– Supprimer des variables
16
17. Exemple de modifications
# 5. Mettre à jour des observations : data.frame et data.table ####
# Créer une nouvelle variable
# avec un data frame
dfPokemon$attackMin <- dfPokemon$Attack
dfPokemon$attackMoyenne <- 15
dfPokemon$attackMax <- dfPokemon$SpAttack
# modifier la variable si l'attaque spéciale est inférieur à l'attaque (normale)
dfPokemon$attackMax[dfPokemon$SpAttack < dfPokemon$Attack] <-
dfPokemon$Attack[dfPokemon$SpAttack < dfPokemon$Attack]
# avec un data table
dtPokemon$attackMin <- dtPokemon$Attack
dtPokemon$attackMoyenne <- 15
dtPokemon$attackMax <- dtPokemon$SpAttack
# ou
dtPokemon[,attackMax := SpAttack]
17
18. Exemple de modifications
# pour une modification :
dtPokemon[SpAttack < Attack, attackMax := Attack]
# pour plusieurs modifications :
dtPokemon[SpAttack < Attack, ':=' (attackMax=Attack, attackMin = SpAttack)]
# ou
dtPokemon[SpAttack < Attack, c("attackMax","attackMin") := list(Attack,SpAttack)]
# # supprimer des variables:
# # avec un data frame
# dfPokemon$attackMax <- NULL
# dtPokemon$attackMin <- NULL
# dtPokemon$attackMoyenne <- NULL
# avec un data table
dtPokemon[,c("attackMax","attackMoyenne","attackMin") := NULL]
18
19. Conclusion
• Utiliser une bibliothèque permettant de
• Selectionner
• Filtrer
• Grouper
• Mettre à jour
De manière efficiente !!!
19