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.