Introduction à data.table
Timeri VECCELLA
1
SÉLECTION DE DONNÉES
Sans data.table on pleure !
2
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
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
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
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
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
UTILISATIONS PRINCIPALES
Youpi !
8
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
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
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
Grouper
• Sélectionner, filtrer, calculer par groupe
(calculer des statistiques agrégées…)
data[<where>, <select>, by = <group>]
12
.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
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
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
Mettre à jours des observations
• Opérateur « := » pour :
– Créer des variables
– Modifier des variables
– Supprimer des variables
16
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
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
Conclusion
• Utiliser une bibliothèque permettant de
• Selectionner
• Filtrer
• Grouper
• Mettre à jour
De manière efficiente !!!
19
MERCI
C’est tout… pour l’instant !!
20
Liens / CRAN
• http://cran.r-project.org/web/packages/data.table/index.html
• http://cran.r-project.org/web/packages/data.table/vignettes/datatable-
intro.pdf
21

Présentation de data.table

  • 1.
  • 2.
    SÉLECTION DE DONNÉES Sansdata.table on pleure ! 2
  • 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 # installationde 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 # selectionnnerle 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
  • 8.
  • 9.
    Filtrer • Garder leslignes 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 pargroupe # 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 pargroupe # 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 à joursdes 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 unebibliothèque permettant de • Selectionner • Filtrer • Grouper • Mettre à jour De manière efficiente !!! 19
  • 20.
    MERCI C’est tout… pourl’instant !! 20
  • 21.
    Liens / CRAN •http://cran.r-project.org/web/packages/data.table/index.html • http://cran.r-project.org/web/packages/data.table/vignettes/datatable- intro.pdf 21