Das ultimative R data.table Spickzettel

Geschwindigkeit. Prägnante Syntax. Abwärtskompatibilität.

Vor allem aber Geschwindigkeit.

Dies sind einige der Funktionen, die Rs data.table für seine Fans attraktiv machen.

Und selbst wenn Sie ein bestätigter Tidyverse-Benutzer sind (wie ich), kann data.table eine nützliche Ergänzung Ihres R-Toolkits sein - insbesondere, wenn Sie mit großen Datenmengen, in einer Shiny-App oder in einer Paketfunktion arbeiten. 

Dieser ultimative Spickzettel für R data.table unterscheidet sich von vielen anderen, da er interaktiv ist. Sie können nach einer bestimmten Phrase wie Spalte hinzufügen oder nach einer Art von Aufgabengruppe wie Teilmenge oder Umformung suchen . Da dieser Spickzettel außerdem einen übersichtlichen Übersetzungscode enthält, können Sie auch nach einem bevorzugten dplyr-Verb suchen, z. B. mutieren oder zeilenweise .

Registrierte Benutzer können eine erweiterte Version dieser interaktiven Tabelle zur Verwendung auf ihren eigenen Systemen herunterladen! Die Registrierung ist kostenlos. 

Durchsuchen Sie data.table und tidyverse Aufgaben und Code

Aufgabe Art data.table Code Tidyverse Code
CSV-Datei einlesen Importieren mydt <- fread ("myfile.csv") myt <- read_csv ("myfile.csv") #OR myt <- vroom :: vroom ("myfile.csv")
Importieren Sie die erste x Anzahl von Zeilen einer CSV-Datei Importieren mydt_x <- fread ("myfile.csv", nrows = x) myt_x <- read_csv ("myfile.csv", n_max = x)
Importieren Sie nur die Zeilen aus einer CSV-Datei, die einem bestimmten Muster entsprechen Importieren mydt_pattern <- fread ("grep 'mypattern' myfile.csv") myt_pattern <- vroom :: vroom (pipe ("grep 'mypattern' myfile.csv"))
Importieren Sie eine komprimierte .gz-Datei Importieren mydt <- fread ("myfile.gz") myt <- vroom :: vroom ("myfile.gz")
Importieren Sie eine komprimierte ZIP-Datei importieren mydt <- fread (cmd = 'unzip -cq myfile.zip') myt <- read_csv ("myfile.zip")
Datentabelle aus vorhandenem Datenrahmen erstellen (tibble for tidyverse) Importieren mydt <- as.data.table (mydf) #OR

setDT (mydf)

myt <- as_tibble (mydf)
Ändern Sie die Datentabelle, ohne eine Kopie zu erstellen Streiten Jede Funktion, die mit set beginnt, z. B. setkey (mydt, mycol) oder die Verwendung des Operators: = in Klammern unzutreffend
Ordnen Sie Zeilen basierend auf mehreren Spaltenwerten Streiten mydt2 <- mydt [order (colA, -colB)] #OR

setorder (mydt, colA, -colB)

myt <- arrangieren (myt, colA, -colB)
Spalten umbenennen Streiten Setnamen (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB')) myt <- umbenennen (myt, NewColA = colA, NewColB = colB)
Spalten neu anordnen: Verschieben Sie einige Spalten an die vorderste Position (ganz links) Streiten setcolorder (mydt, c ("colB", "colC")) # colB jetzt auf Position 1 und colC auf Position 2 myt <- relocate (myt, colB, colC)
Filtern Sie die Zeilen nach der Zeilennummer n Teilmenge mydt2 <- mydt [n] myt2 <- Scheibe (myt, n)
Filter für die letzte Zeile Teilmenge mydt2 <- mydt [.N] myt2 <- Slice (myt, n ())
Zeilen nach Bedingung filtern Teilmenge # In einigen Fällen beschleunigt setkey (mydt, colA, colB) die Leistung # für logische Tests auf colA und colB; Gleiches gilt für andere Spalten

mydt2 <- mydt [logischer Ausdruck]

myt2 <- Filter (myt, logischer Ausdruck)
Filtern Sie Zeilen, in denen colA gleich string1 oder string2 ist Teilmenge mydt2 <- mydt [colA% chin% c ("string1", "string2")] myt2 <- Filter (myt, colA% in% c ("string1", "string2"))
Filtern Sie Zeilen, in denen colA mit einem regulären Ausdruck übereinstimmt Teilmenge mydt2 <- mydt [colA% like% "mypattern"] myt2 <- Filter (myt, stringr :: str_detect (colA, "mypattern"))
Filtern Sie Zeilen, in denen colA-Werte zwischen 2 Zahlen liegen Teilmenge mydt2 <- mydt [colA% zwischen% c (n1, n2)] myt2 <- Filter (myt, zwischen (colA, n1, n2))
Filtern Sie nach den ersten n Zeilen nach Gruppe Teilmenge mydt2 <- mydt [, .SD [1: n], von = groupcol] myt2% group_by (groupcol)%>% Slice (1: n)
Filtern Sie die Zeilen nach dem Maximalwert nach Gruppe Teilmenge mydt2 <- mydt [, .SD [which.max (valcol)], by = groupcol] myt2% group_by (groupcol)%>% filter (valcol == max (valcol))
Wählen Sie die Spalte aus und geben Sie die Ergebnisse als Vektor zurück Teilmenge myvec <- mydt [, colname] myvec <- pull (myt, colname)
Wählen Sie mehrere Spalten aus, um eine neue data.table zu erstellen (Datenrahmen oder tibble für tidyverse). Teilmenge mydt2 <- mydt [, Liste (colA, colB)] #OR

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

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

myt2 <- select (myt, colA, colB)
Wählen Sie mehrere Spalten mit einer Variablen aus, die die Spaltennamen enthält Teilmenge 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 <- select (myt, all_of (my_col_names))

Wählen Sie mehrere Spalten aus und benennen Sie einige um Teilmenge mydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)] myt2 <- select (myt, neuer Name1 = Spalte1, neuer Name2 = Spalte2, Spalte3)
Mehrere Spalten ausschließen Teilmenge mydt2 <- mydt [, -c ("colA", "colB")] #OR

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

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

mydt2 <- mydt [,! .. my_col_names]

myt2 <- select (myt, -c (colA, colB)) #OR

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

myt2 <- select (myt, - {{my_col_names}})

Entfernen Sie doppelte Zeilen basierend auf Werten in mehreren Spalten Teilmenge mydt2 <- unique (mydt, by = c ("colA", "colB")) myt2 <- different (myt, colA, colB, .keep_all = TRUE)
Zählen Sie eindeutige Zeilen basierend auf mehreren Spalten Zusammenfassen uniqueN (mydt, by = c ("colA", "colB")) nrow (verschieden (myt, colA, colB))
Führen Sie zusammenfassende Berechnungen für Daten durch Zusammenfassen mydt2 <- mydt [, myfun (colA ...)] myt2% fassen zusammen (ColName = myfun (colA ...))
Führen Sie zusammenfassende Berechnungen für Daten einer Gruppe durch Zusammenfassen mydt2 <- mydt [, myfun (colA ...), von = groupcol] myt2%

group_by (groupcol)%>%

zusammenfassen(

NewCol = myfun (colA ...)

)

Führen Sie zusammenfassende Berechnungen für Daten nach einer Gruppe durch und benennen Sie die neue Spalte Zusammenfassen mydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), by = groupcol] myt2%

group_by (groupcol)%>%

zusammenfassen(

NewCol = myfun (colA ...)

)

Führen Sie zusammenfassende Berechnungen für Daten mehrerer Gruppen durch Zusammenfassen mydt2 <- mydt [, myfun (colA ...), by =. (groupcol1, groupcol2)] myt2%

group_by (groupcol1, groupcol2)%>%

zusammenfassen(

NewCol = myfun (colA ...)

)

Führen Sie eine Zusammenfassungsberechnung für gefilterte Daten nach mehreren Gruppen durch Zusammenfassen mydt2 <- mydt [Filterausdruck, myfun (colA), by =. (groupcol1, groupcol2)] myt2%

Filter (Filterausdruck)%>%

group_by (groupcol1, groupcol2)%>%

zusammenfassen(

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

)

Zählen Sie die Anzahl der Zeilen nach Gruppen Zusammenfassen mydt2 <- mydt [,. N, by = groupcol] #für eine Gruppe #OR

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

myt2 <- count (myt, groupcol) #für eine Gruppe #OR

myt2 <- count (myt, groupcol1, groupcol2)

Fassen Sie mehrere Spalten zusammen und geben Sie Ergebnisse in mehreren Spalten zurück Zusammenfassen mydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

zusammenfassen(

über (c (colA, colB), myfun)

)

Fassen Sie mehrere Spalten nach Gruppen zusammen und geben Sie die Ergebnisse in mehreren Spalten zurück Zusammenfassen mydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

group_by (groupcol)%>%

zusammenfassen (über (c (colA, colB), myfun))

Fügen Sie eine Spalte hinzu Berechnung mydt [, MyNewCol: = myfun (colA)] Mein t %

mutieren(

MyNewCol = myfun (colA)

)

Fügen Sie mehrere Spalten gleichzeitig hinzu Berechnung # Verwenden Sie eine Funktion oder einen Ausdruck

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

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

Mein t %

mutieren(

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Fügen Sie eine Spalte hinzu, indem Sie aktuelle und vorherige Werte aus einer anderen Spalte verwenden, z. B. die Differenz zwischen dem Wert eines Datums und dem vorherigen Datum Berechnung mydt [, Diff: = colA - shift (colA)] myt <- mutieren (myt, Diff = colA - lag (colA))
Fügen Sie eine Spalte hinzu, die auf den vorherigen Wert einer Spalte durch eine Gruppe verweist Berechnung mydt2 <- mydt [, Diff: = colA - shift (colA), by = groupcol] myt2% group_by (groupcol)%>% mutieren (Diff = colA - lag (colA))
Fügen Sie eine Spalte mit Zeilen-ID-Nummern nach Gruppe hinzu Berechnung mydt [, myid: = 1: .N, by = groupcol] myt% group_by (groupcol)%>% mutate (myid = row_number ())
Fügen Sie eine Spalte hinzu, die auf mehreren Bedingungen basiert, ohne mehrere if else-Anweisungen zu verwenden (wie SQLs CASE). Berechnung # Benötigt data.table Version 1.13 oder höher

# Ich mag jede Bedingung in einer neuen Zeile, aber das ist nicht erforderlich

mydt2 <- mydt [, NewCol: = fcase (

Bedingung1, "Wert1",

Bedingung2, "Wert2",

Bedingung3, "Wert3",

default = "Other" # Wert für alle anderen

)]

myt2%

mutieren(

NewCol = case_when (

Bedingung1 ~ "Wert1",

Bedingung2 ~ "Wert2",

Bedingung3 ~ "Wert3",

TRUE ~ "Andere"

)

)

Fügen Sie eine Spalte hinzu, indem Sie nach Zeilen arbeiten Berechnung mydt [, newcol: = myfun (colB, colC, colD), by = 1: nrow (mydt)]

# oder wenn colA alle eindeutigen Werte hat

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

Mein t %

zeilenweise ()%>%

mutieren(

newcol = myfun (colB, colC, colD)

)

# oder

Mein t %

zeilenweise ()%>%

mutieren(

#use dplyr Syntax auswählen:

newcol = myfun (c_across (colB: colD))

)

Verbinden Sie zwei Datensätze durch mehr als eine Spalte. Behalte alles in Satz1, aber nur Übereinstimmungen in Satz2 Beitreten 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 <- left_join (df1, df2, by = c ("df1col" = "df2col"))
Verbinden Sie 2 Datensätze durch mehr als eine Spalte - behalten Sie alle in Satz1 bei, aber nur Übereinstimmungen in Satz2 Beitreten mydt <- merge (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) #ODER

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Verbinden Sie zwei Datensätze durch eine gemeinsame Spalte. halte nur Streichhölzer Beitreten mydt <- merge (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2") myt <- inner_join (df1, df2, by = c ("df1col" = "df2col"))
Verbinden Sie zwei Datensätze durch eine gemeinsame Spalte und behalten Sie alle Daten in beiden Sätzen bei, unabhängig davon, ob Übereinstimmungen vorliegen oder nicht Beitreten mydt <- merge (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", all = TRUE) myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Kombinieren Sie zwei Datensätze, indem Sie Zeilen von einer zur anderen hinzufügen Beitreten mydt_joined <- rbindlist (Liste (mydt, mydt2)) myt_joined <- bind_rows (myt, myt2)
Daten weit zu lang umformen Umformen mydt_long <- blend (mydt, Measure.vars = c ("col1", "col2", "col3"), variable.name = "NewCategoryColName", value.name = "NewValueColName") myt_long <- pivot_longer (myt, cols = launch_with ("col"), names_to = "NewCategoryColName", values_to = "NewValueColName")
Daten lange zu breit umformen Umformen mydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName") myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Verketten Sie mehrere Ausdrücke Streiten mydt [Ausdruck1] [Ausdruck2] Mein t %

Ausdruck1%>%

Ausdruck2

Exportieren Sie Daten in eine CSV-Datei Export fwrite (mydt, "myfile.csv") write_csv (myt, "myfile.csv")
Fügen Sie Zeilen an eine vorhandene CSV-Datei an Export fwrite (mydt2, "myfile.csv", append = TRUE) vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
Exportieren Sie Daten in eine komprimierte CSV-Datei Export fwrite (mydt, "myfile.csv.gz", compress = "gzip") vroom :: vroom_write (myt, "myfile2.csv.gz")

Es gibt noch viel mehr über data.table zu lernen! Einige Grundlagen zu data.table finden Sie in meinem fünfminütigen Einführungsvideo:

Schließlich enthält die Website data.table viele weitere Informationen und Tipps, z. B. die Verwendung setkey()und andere Indizierungstipps.