La feuille de triche ultime pour les données R.

La vitesse. Syntaxe concise. Rétrocompatibilité.

Mais surtout la vitesse.

Ce sont quelques-unes des fonctionnalités qui rendent la table data.table de R. attrayante pour ses fans.

Et même si vous êtes un utilisateur confirmé de tidyverse (comme je le suis), data.table peut être un ajout utile à votre boîte à outils R - en particulier lorsque vous travaillez avec de grands ensembles de données, dans une application Shiny ou dans une fonction de package. 

Cette feuille de triche ultime R data.table est différente de beaucoup d'autres car elle est interactive. Vous pouvez rechercher une expression spécifique comme ajouter une colonne ou par un type de groupe de tâches tel que sous - ensemble ou remodeler . De plus, parce que cette feuille de triche comprend tidyverse code « traduction », vous pouvez également rechercher un dplyr favori verbe, comme muter ou rowwise .

Les utilisateurs enregistrés peuvent télécharger une version étendue de ce tableau interactif pour une utilisation sur leurs propres systèmes! L'inscription est gratuite. 

Rechercher des tâches et du code data.table et tidyverse

Tâche Type Code data.table Code Tidyverse
Lire dans un fichier CSV Importer mydt <- fread ("monfichier.csv") myt <- read_csv ("monfichier.csv") #OR myt <- vroom :: vroom ("monfichier.csv")
Importer le premier x nombre de lignes d'un fichier CSV Importer mydt_x <- fread ("monfichier.csv", nrows = x) myt_x <- read_csv ("monfichier.csv", n_max = x)
Importez uniquement les lignes d'un fichier CSV qui correspondent à un certain modèle Importer mydt_pattern <- fread ("grep 'mypattern' myfile.csv") myt_pattern <- vroom :: vroom (pipe ("grep 'mypattern' monfichier.csv"))
Importer un fichier compressé .gz Importer mydt <- fread ("myfile.gz") myt <- vroom :: vroom ("myfile.gz")
Importer un fichier compressé .zip importer mydt <- fread (cmd = 'unzip -cq monfichier.zip') myt <- read_csv ("monfichier.zip")
Créer une table de données à partir d'un bloc de données existant (tibble pour tidyverse) Importer mydt <- as.data.table (mydf) #OR

setDT (mydf)

myt <- as_tibble (mydf)
Modifiez data.table en place sans faire de copie Dispute toute fonction commençant par set telle que setkey (mydt, mycol) ou en utilisant l'opérateur: = entre crochets n'est pas applicable
Trier les lignes en fonction de plusieurs valeurs de colonne Dispute mydt2 <- mydt [commande (colA, -colB)] #OR

setorder (mydt, colA, -colB)

myt <- arrange (myt, colA, -colB)
Renommer les colonnes Dispute setnames (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB')) myt <- renommer (myt, NewColA = colA, NewColB = colB)
Réorganisation des colonnes: déplacez certaines colonnes vers l'avant (la plus à gauche) Dispute setcolorder (mydt, c ("colB", "colC")) # colB maintenant en position 1 et colC en position 2 myt <- relocaliser (myt, colB, colC)
Filtrer les lignes pour le numéro de ligne n Sous-ensemble mydt2 <- mydt [n] myt2 <- tranche (myt, n)
Filtrer pour la dernière ligne Sous-ensemble mydt2 <- mydt [.N] myt2 <- tranche (myt, n ())
Filtrer les lignes par condition Sous-ensemble # Dans certains cas, setkey (mydt, colA, colB) accélérera les performances # pour les tests logiques sur colA et colB; même chose avec d'autres colonnes

mydt2 <- mydt [expression logique]

myt2 <- filter (myt, expression logique)
Filtrer les lignes où colA est égal à string1 ou string2 Sous-ensemble mydt2 <- mydt [colA% chin% c ("string1", "string2")] myt2 <- filtre (myt, colA% dans% c ("chaîne1", "chaîne2"))
Filtrer les lignes où colA correspond à une expression régulière Sous-ensemble mydt2 <- mydt [colA% like% "mypattern"] myt2 <- filtre (myt, stringr :: str_detect (colA, "mypattern"))
Filtrer les lignes où les valeurs colA sont comprises entre 2 nombres Sous-ensemble mydt2 <- mydt [colA% entre% c (n1, n2)] myt2 <- filtre (myt, entre (colA, n1, n2))
Filtrer les n premières lignes par groupe Sous-ensemble mydt2 <- mydt [, .SD [1: n], par = groupcol] myt2% group_by (groupcol)%>% tranche (1: n)
Filtrer les lignes pour la valeur maximale par groupe Sous-ensemble mydt2 <- mydt [, .SD [which.max (valcol)], by = groupcol] myt2% group_by (groupcol)%>% filtre (valcol == max (valcol))
Sélectionnez la colonne et renvoyez les résultats sous forme de vecteur Sous-ensemble myvec <- mydt [, colname] myvec <- pull (myt, colname)
Sélectionnez plusieurs colonnes pour créer une nouvelle table de données (bloc de données ou tibble pour tidyverse) Sous-ensemble mydt2 <- mydt [, list (colA, colB)] #OR

mydt2 <- mydt [,. (colA, colB)] #OR

mydt2 <- mydt [, c ("colA", "colB")]

myt2 <- sélectionnez (myt, colA, colB)
Sélectionnez plusieurs colonnes à l'aide d'une variable contenant les noms de colonne Sous-ensemble my_col_names <- c ("colA", "colB")

mydt2 <- mydt [, ..my_col_names] #OR

mydt2 <- mydt [, my_col_names, with = FALSE]

my_col_names <- c ("colA", "colB")

myt2 <- sélectionnez (myt, all_of (my_col_names))

Sélectionnez plusieurs colonnes et renommez-en quelques-unes Sous-ensemble mydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)] myt2 <- sélectionnez (myt, newname1 = col1, newname2 = col2, col3)
Exclure plusieurs colonnes Sous-ensemble mydt2 <- mydt [, -c ("colA", "colB")] #OR

mydt2 <- mydt [,! c ("colA", "colB")] #OR

my_col_names <- c ("colA", "colB")

mydt2 <- mydt [,! .. my_col_names]

myt2 <- sélectionnez (myt, -c (colA, colB)) #OR

my_col_names <- c ("colA", "colB")

myt2 <- sélectionnez (myt, - {{my_col_names}})

Supprimer les lignes en double en fonction des valeurs de plusieurs colonnes Sous-ensemble mydt2 <- unique (mydt, by = c ("colA", "colB")) myt2 <- distinct (myt, colA, colB, .keep_all = TRUE)
Compter les lignes uniques en fonction de plusieurs colonnes Résumer uniqueN (mydt, by = c ("colA", "colB")) nrow (distinct (myt, colA, colB))
Exécuter des calculs récapitulatifs sur les données Résumer mydt2 <- mydt [, myfun (colA ...)] myt2% résumer (ColName = myfun (colA ...))
Exécuter des calculs récapitulatifs sur les données par un groupe Résumer mydt2 <- mydt [, myfun (colA ...), by = groupcol] myt2%

group_by (groupcol)%>%

résumer(

NewCol = myfun (colA ...)

)

Exécuter des calculs récapitulatifs sur les données par un groupe et nommer une nouvelle colonne Résumer mydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), by = groupcol] myt2%

group_by (groupcol)%>%

résumer(

NewCol = myfun (colA ...)

)

Exécuter des calculs récapitulatifs sur les données par plusieurs groupes Résumer mydt2 <- mydt [, myfun (colA ...), by =. (groupcol1, groupcol2)] myt2%

group_by (groupcol1, groupcol2)%>%

résumer(

NewCol = myfun (colA ...)

)

Exécuter un calcul récapitulatif sur les données filtrées par plusieurs groupes Résumer mydt2 <- mydt [expression de filtre, myfun (colA), by =. (groupcol1, groupcol2)] myt2%

filtre (expression de filtre)%>%

group_by (groupcol1, groupcol2)%>%

résumer(

NewCol = myfun (colA), .groups = "garder"

)

Compter le nombre de lignes par groupes Résumer mydt2 <- mydt [,. N, by = groupcol] #pour un groupe #OR

mydt2 <- mydt [, .N, by =. (groupcol1, groupcol2)]

myt2 <- count (myt, groupcol) #for un groupe #OR

myt2 <- count (myt, groupcol1, groupcol2)

Résumer plusieurs colonnes et renvoyer les résultats dans plusieurs colonnes Résumer mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB")]

myt2%

résumer(

à travers (c (colA, colB), myfun)

)

Récapitulez plusieurs colonnes par groupe et renvoyez les résultats dans plusieurs colonnes Résumer mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB"), par = groupcol]

myt2%

group_by (groupcol)%>%

résumer (à travers (c (colA, colB), myfun))

Ajouter une colonne Calculer mydt [, MyNewCol: = myfun (colA)] myt%

subir une mutation(

MyNewCol = myfun (colA)

)

Ajouter plusieurs colonnes à la fois Calculer # utiliser n'importe quelle fonction ou expression

mydt [, `: =` (NewCol1 = myfun (colA), NewCol2 = colB + colC)] #OR

mydt [, c ("NewCol1", "newCol2"): = list (myfun (colA), colB + colC)]

myt%

subir une mutation(

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Ajouter une colonne en utilisant les valeurs actuelles et précédentes d'une autre colonne, comme trouver la différence entre la valeur à une date et la date précédente Calculer mydt [, Diff: = colA - shift (colA)] myt <- muter (myt, Diff = colA - lag (colA))
Ajouter une colonne référençant la valeur précédente d'une colonne par un groupe Calculer mydt2 <- mydt [, Diff: = colA - shift (colA), by = groupcol] myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Ajouter une colonne avec des numéros d'identification de ligne par groupe Calculer mydt [, myid: = 1: .N, by = groupcol] myt% group_by (groupcol)%>% mutate (myid = row_number ())
Ajouter une colonne basée sur plusieurs conditions sans utiliser plusieurs instructions if else (comme CASE de SQL) Calculer # Nécessite la version 1.13 ou ultérieure de data.table

# J'aime chaque condition sur une nouvelle ligne mais ce n'est pas obligatoire

mydt2 <- mydt [, NewCol: = fcase (

condition1, "Valeur1",

condition2, "Valeur2",

condition3, "Valeur3",

default = "Autre" # valeur pour tout le reste

)]

myt2%

subir une mutation(

NewCol = case_when (

condition1 ~ "Valeur1",

condition2 ~ "Valeur2",

condition3 ~ "Valeur3",

TRUE ~ "Autre"

)

)

Ajouter une colonne en opérant par ligne Calculer mydt [, newcol: = myfun (colB, colC, colD), by = 1: nrow (mydt)]

# ou si colA a toutes les valeurs uniques

mydt [, newcol: = myfun (colB, colC, colD), par = colA]

myt%

rowwise ()%>%

subir une mutation(

newcol = myfun (colB, colC, colD)

)

# ou

myt%

rowwise ()%>%

subir une mutation(

#use dplyr select syntax:

newcol = myfun (c_across (colB: colD))

)

Joindre deux ensembles de données par plus d'une colonne; garder tout dans set1 mais ne correspond qu'à set2 Joindre mydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] #OR

mydt <- merge (dt1, dt2, by.x = "dt1col", by.y = "dt2col", all.x = TRUE) #OR

setkey (dt1, "dt1col") setkey (dt2, "dt2col") mydt <- dt2 [dt1]

myt <- joint_gauche (df1, df2, par = c ("df1col" = "df2col"))
Joindre 2 ensembles de données par plus d'une colonne - tout conserver dans set1 mais ne correspond qu'à set2 Joindre mydt <- merge (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) #OU

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Joignez deux ensembles de données par une colonne commune; ne garde que les allumettes Joindre mydt <- merge (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2") myt <- jointure_intérieure (df1, df2, par = c ("df1col" = "df2col"))
Joindre deux ensembles de données par une colonne commune et conserver toutes les données dans les deux ensembles, qu'il y ait ou non des correspondances Joindre mydt <- merge (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", all = TRUE) myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Combinez deux ensembles de données en ajoutant des lignes de l'un vers le bas de l'autre Joindre mydt_joined <- rbindlist (liste (mydt, mydt2)) myt_joined <- bind_rows (myt, myt2)
Remodeler les données de large à long Remodeler mydt_long <- melt (mydt, measure.vars = c ("col1", "col2", "col3"), variable.name = "NewCategoryColName", value.name = "NewValueColName") myt_long <- pivot_longer (myt, cols = starts_with ("col"), names_to = "NewCategoryColName", values_to = "NewValueColName")
Remodeler les données de long en large Remodeler mydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName") myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Chaîne de plusieurs expressions Dispute mydt [expr1] [expr2] myt%

expr1%>%

expr2

Exporter les données dans un fichier CSV Exportation fwrite (mydt, "myfile.csv") write_csv (myt, "monfichier.csv")
Ajouter des lignes à un fichier CSV existant Exportation fwrite (mydt2, "myfile.csv", append = TRUE) vroom :: vroom_write (myt2, "monfichier.csv", delim = ",", append = TRUE)
Exporter les données vers un fichier CSV compressé Exportation fwrite (mydt, "myfile.csv.gz", compress = "gzip") vroom :: vroom_write (myt, "monfichier2.csv.gz")

Il y a beaucoup plus à apprendre sur data.table! Pour quelques notions de base sur data.table, regardez ma vidéo d'introduction de cinq minutes:

Enfin, le site data.table contient beaucoup plus d'informations et de conseils, tels que l'utilisation setkey()et d'autres astuces d'indexation.