Programmering

Det ultimative R data.table snyderark

Fart. Kortfattet syntaks. Bagudkompatibilitet.

Men især hastighed.

Det er nogle af de funktioner, der gør R's data. Tabel overbevisende for sine fans.

Og selvom du er en bekræftet tidyverse bruger (som jeg er), kan data.table være en nyttig tilføjelse til dit R-værktøjssæt - især når du arbejder med store datasæt, i en skinnende app eller i en pakkefunktion.

Dette ultimative snydeark med R-data.tabel adskiller sig fra mange andre, fordi det er interaktiv. Du kan søge efter en bestemt sætning som tilføj kolonne eller af en type opgavegruppe som f.eks Delmængde eller Omform. Derudover, fordi dette snydeark indeholder tidyverse "oversættelseskode", kan du også søge efter et yndlings dplyr-verb, f.eks. mutere eller i række.

Registrerede brugere kan downloade en udvidet version af denne interaktive tabel til brug på deres egne systemer! Registrering er gratis.

Søg data.table og tidyverse opgaver og kode

OpgaveTypedatatabelkodeTidyverse kode
Læs i CSV-filImporteremydt <- fread ("myfile.csv")myt <- read_csv ("myfile.csv") #OR myt <- vroom :: vroom ("myfile.csv")
Importer det første x antal rækker i en CSV-filImporteremydt_x <- fread ("myfile.csv", nrows = x)myt_x <- read_csv ("myfile.csv", n_max = x)
Importer kun de rækker fra en CSV-fil, der matcher et bestemt mønsterImporteremydt_pattern <- fread ("grep 'mypattern' myfile.csv")myt_pattern <- vroom :: vroom (pipe ("grep 'mypattern' myfile.csv"))
Importer en .gz komprimeret filImporteremydt <- fread ("myfile.gz")myt <- vroom :: vroom ("myfile.gz")
Importer en komprimeret.zip-filimporteremydt <- fread (cmd = 'unzip -cq myfile.zip')myt <- read_csv ("myfile.zip")
Opret datatabel fra eksisterende dataramme (tibble for tidyverse)Importeremydt <- som.data.table (mydf) #OR

setDT (mydf)

myt <- som_tibble (mydf)
Skift data.table på plads uden at lave en kopiWrangleenhver funktion, der starter med sæt som f.eks. sætkey (mydt, mycol) eller ved hjælp af: = operatoren inden for parentesikke anvendelig
Bestil rækker baseret på flere kolonneværdierWranglemydt2 <- mydt [rækkefølge (colA, -colB)] #OR

sætorden (mydt, colA, -colB)

myt <- arranger (myt, colA, -colB)
Omdøb kolonnerWranglesætnavne (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB'))myt <- omdøb (myt, NewColA = colA, NewColB = colB)
Omarrangere kolonner: Flyt nogle kolonner til den forreste (længst til venstre) positionWranglesætfarve (mydt, c ("colB", "colC")) # colB nu i position 1 og colC i position 2myt <- flyt (myt, colB, colC)
Filtrer rækker for række nummer nDelmængdemydt2 <- mydt [n]myt2 <- skive (myt, n)
Filtrer til sidste rækkeDelmængdemydt2 <- mydt [.N]myt2 <- skive (myt, n ())
Filtrer rækker efter tilstandDelmængde# I nogle tilfælde vil setkey (mydt, colA, colB) fremskynde ydeevnen # for logiske tests på colA og colB; det samme med andre kolonner

mydt2 <- mydt [logisk udtryk]

myt2 <- filter (myt, logisk udtryk)
Filtrer rækker, hvor colA er lig med streng1 eller streng2Delmængdemydt2 <- mydt [colA% chin% c ("string1", "string2")]myt2 <- filter (myt, colA% i% c ("string1", "string2"))
Filtrer rækker, hvor colA matcher et regulært udtrykDelmængdemydt2 <- mydt [colA% som% "mypattern"]myt2 <- filter (myt, stringr :: str_detect (colA, "mypattern"))
Filtrer rækker, hvor colA-værdier er mellem 2 talDelmængdemydt2 <- mydt [colA% mellem% c (n1, n2)]myt2 <- filter (myt, mellem (colA, n1, n2))
Filtrer efter første n række efter gruppeDelmængdemydt2 <- mydt [, .SD [1: n], af = groupcol]myt2% group_by (groupcol)%>% udsnit (1: n)
Filtrer rækker for maksimal værdi efter gruppeDelmængdemydt2 <- mydt [, .SD [which.max (valcol)], af = groupcol]myt2% group_by (groupcol)%>% filter (valcol == max (valcol))
Vælg kolonne, og returner resultater som en vektorDelmængdemyvec <- mydt [, colname]myvec <- pull (myt, colname)
Vælg flere kolonner for at oprette en ny data.tabel (dataramme eller tibble for tidyverse)Delmængdemydt2 <- mydt [, liste (colA, colB)] #OR

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

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

myt2 <- vælg (myt, colA, colB)
Vælg flere kolonner ved hjælp af en variabel, der indeholder kolonnenavneneDelmængdemy_col_names <- c ("colA", "colB")

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

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

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

myt2 <- vælg (myt, all_of (my_col_names))

Vælg flere kolonner, og omdøb demDelmængdemydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)]myt2 <- vælg (myt, newname1 = col1, newname2 = col2, col3)
Ekskluder flere kolonnerDelmængdemydt2 <- mydt [, -c ("colA", "colB")] #OR

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

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

mydt2 <- mydt [,! .. my_col_names]

myt2 <- vælg (myt, -c (colA, colB)) #OR

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

myt2 <- vælg (myt, - {{my_col_names}})

Fjern dublerede rækker baseret på værdier i flere kolonnerDelmængdemydt2 <- unik (mydt, by = c ("colA", "colB"))myt2 <- tydelig (myt, colA, colB, .keep_all = TRUE)
Tæl unikke rækker baseret på flere kolonnerSammenfatteuniqueN (mydt, by = c ("colA", "colB"))nrow (distinkt (myt, colA, colB))
Kør sammenfattende beregninger på dataSammenfattemydt2 <- mydt [, myfun (colA ...)]myt2% opsummer (ColName = myfun (colA ...))
Kør sammenfattende beregninger på data efter en gruppeSammenfattemydt2 <- mydt [, myfun (colA ...), af = groupcol] myt2%

group_by (groupcol)%>%

sammenfatte(

NewCol = myfun (colA ...)

)

Kør sammenfattende beregninger på data efter en gruppe, og navngiv den nye kolonneSammenfattemydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), af = groupcol]myt2%

group_by (groupcol)%>%

sammenfatte(

NewCol = myfun (colA ...)

)

Kør sammenfattende beregninger på data fra flere grupperSammenfattemydt2 <- mydt [, myfun (colA ...), af =. (groupcol1, groupcol2)]myt2%

group_by (groupcol1, groupcol2)%>%

sammenfatte(

NewCol = myfun (colA ...)

)

Kør oversigtsberegning på filtrerede data efter flere grupperSammenfattemydt2 <- mydt [filterudtryk, myfun (colA), ved =. (groupcol1, groupcol2)]myt2%

filter (filterudtryk)%>%

group_by (groupcol1, groupcol2)%>%

sammenfatte(

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

)

Tæl antal rækker efter grupperSammenfattemydt2 <- mydt [,. N, af = groupcol] #for en gruppe #OR

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

myt2 <- count (myt, groupcol) #for en gruppe #OR

myt2 <- count (myt, groupcol1, groupcol2)

Opsummer flere kolonner og returner resultater i flere kolonnerSammenfattemydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

sammenfatte(

på tværs af (c (colA, colB), myfun)

)

Opsummer flere kolonner efter gruppe, og returner resultater i flere kolonnerSammenfattemydt2 <- mydt [, lapply (.SD, myfun),

.Sdcols = c ("colA", "colB"), efter = groupcol]

myt2%

group_by (groupcol)%>%

opsummer (på tværs af (c (colA, colB), myfun))

Tilføj en kolonneBeregnmydt [, MyNewCol: = myfun (colA)] myt%

mutere (

MyNewCol = myfun (colA)

)

Tilføj flere kolonner på én gangBeregn# brug en hvilken som helst funktion eller et udtryk

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

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

myt%

mutere (

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Tilføj kolonne ved hjælp af aktuelle og tidligere værdier fra en anden kolonne, såsom at finde forskellen mellem værdi på en dato vs. den foregående datoBeregnmydt [, Diff: = colA - shift (colA)]myt <- mutere (myt, Diff = colA - lag (colA))
Tilføj kolonne, der henviser til den tidligere værdi af en kolonne af en gruppeBeregnmydt2 <- mydt [, Diff: = colA - shift (colA), by = groupcol]myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Tilføj kolonne med række-ID-numre efter gruppeBeregnmydt [, myid: = 1: .N, by = groupcol]myt% group_by (groupcol)%>% mutate (myid = row_number ())
Tilføj kolonne baseret på flere betingelser uden at bruge flere hvis ellers udsagn (som SQL's CASE)Beregn# Har brug for data.table version 1.13 eller nyere

# Jeg kan godt lide hver betingelse på en ny linje, men det er ikke nødvendigt

mydt2 <- mydt [, NewCol: = fcase (

betingelse1, "Værdi1",

betingelse2, "Værdi2",

betingelse3, "Værdi3",

default = "Andet" # værdi for alt andet

)]

myt2%

mutere (

NewCol = case_when (

betingelse1 ~ "Værdi1",

betingelse2 ~ "Værdi2",

betingelse3 ~ "Værdi3",

SAND ~ "Andet"

)

)

Tilføj kolonne via drift efter rækkeBeregnmydt [, newcol: = myfun (colB, colC, colD), ved = 1: nrow (mydt)]

# eller hvis colA har alle unikke værdier

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

myt%

rækkevis ()%>%

mutere (

newcol = myfun (colB, colC, colD)

)

# eller

myt%

rækkevis ()%>%

mutere (

# brug dplyr vælg syntaks:

newcol = myfun (c_across (colB: colD))

)

Deltag i to datasæt med mere end en kolonne; hold alt i sæt1, men kun match i sæt2Tilsluttemydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] # ELLER

mydt <- flet (dt1, dt2, by.x = "dt1col", by.y = "dt2col", all.x = SAND) # ELLER

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

myt <- left_join (df1, df2, by = c ("df1col" = "df2col"))
Deltag i 2 datasæt med mere end en kolonne - hold alt i sæt1, men match kun i sæt2Tilsluttemydt <- flet (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) # ELLER

sæt nøgle (dt1, dt1colA, dt1colB)

sætnøgle (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Deltag i to datasæt med en fælles kolonne; kun holde tændstikkerTilsluttemydt <- flet (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2")myt <- inner_join (df1, df2, by = c ("df1col" = "df2col"))
Deltag i to datasæt med en fælles kolonne, og opbevar alle data i begge sæt, uanset om der er matchesTilsluttemydt <- flet (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", alt = SAND)myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Kombiner to datasæt ved at tilføje rækker fra en til bunden af ​​en andenTilsluttemydt_joined <- rbindlist (liste (mydt, mydt2))myt_joined <- bind_rows (myt, myt2)
Omform data bredt til langtOmformmydt_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")
Omform data lang til bredOmformmydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName")myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Kæd flere udtrykWranglemydt [expr1] [expr2]myt%

ekspr1%>%

ekspr2

Eksporter data til en CSV-filEksportfwrite (mydt, "myfile.csv")write_csv (myt, "myfile.csv")
Føj rækker til en eksisterende CSV-filEksportfwrite (mydt2, "myfile.csv", append = TRUE)vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
Eksporter data til en komprimeret CSV-filEksportfwrite (mydt, "myfile.csv.gz", compress = "gzip")vroom :: vroom_write (myt, "myfile2.csv.gz")

Der er meget mere at lære om data.table! For nogle grundlæggende data.table, tjek min introduktionsvideo på fem minutter:

Endelig har webstedet data.table meget mere information og tip, såsom brug sæt nøgle () og andre indekseringstip.