Programiranje

The ultimate R data.table varalnica

Hitrost. Kratka sintaksa. Združljivost nazaj.

Predvsem pa hitrost.

To je nekaj funkcij, zaradi katerih so podatki R-a privlačni za oboževalce.

Tudi če ste potrjeni uporabnik urejenosti (kot sem jaz), je data.table lahko koristen dodatek vašemu orodju R - zlasti pri delu z velikimi nabori podatkov, v aplikaciji Shiny ali v paketni funkciji.

Ta R data.table ultimate cheat sheet se razlikuje od mnogih drugih, ker je interaktivni. Iščete lahko določeno besedno zvezo, kot je dodaj stolpec ali po vrsti delovne skupine, kot je Podnabor ali Preoblikovanje. Poleg tega, ker ta goljufiv vsebuje tidyverse kodo za "prevajanje", lahko poiščete tudi najljubši glagol dplyr, kot je mutirati ali rowwise.

Registrirani uporabniki lahko prenesejo razširjeno različico te interaktivne tabele za uporabo v svojih sistemih! Prijava je brezplačna.

Iskanje po podatkih po tabeli in tidyverse opravilih in kodi

NalogaTipdata.table KodaKoda Tidyverse
Preberite v datoteki CSVUvozimydt <- fread ("myfile.csv")myt <- read_csv ("myfile.csv") # ALI myt <- vroom :: vroom ("myfile.csv")
Uvozi prvih x število vrstic datoteke CSVUvozimydt_x <- fread ("myfile.csv", nrows = x)myt_x <- read_csv ("myfile.csv", n_max = x)
Uvozi samo tiste vrstice iz datoteke CSV, ki se ujemajo z določenim vzorcemUvozimydt_pattern <- fread ("grep 'mypattern' myfile.csv")myt_pattern <- vroom :: vroom (cev ("grep 'mypattern' myfile.csv"))
Uvozi stisnjeno datoteko .gzUvozimydt <- fread ("myfile.gz")myt <- vroom :: vroom ("myfile.gz")
Uvozi stisnjeno datoteko.zipuvozmydt <- fread (cmd = 'unzip -cq myfile.zip')myt <- read_csv ("myfile.zip")
Ustvari podatkovno tabelo iz obstoječega podatkovnega okvira (tibble za tidyverse)Uvozimydt <- as.data.table (mydf) # ALI

setDT (mydf)

myt <- as_tibble (mydf)
Spremenite data.table na mestu, ne da bi kopiraliPrepirkatera koli funkcija, ki se začne z nizom, kot je setkey (mydt, mycol) ali z uporabo operatorja: = v oklepajihse ne uporablja
Vrstice razvrstite na podlagi več vrednosti stolpcevPrepirmydt2 <- mydt [naročilo (colA, -colB)] # ALI

setorder (mydt, colA, -colB)

myt <- poskrbi (myt, colA, -colB)
Preimenuj stolpcePrepirimena imen (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB'))myt <- preimenuj (myt, NewColA = colA, NewColB = colB)
Preurejanje stolpcev: premaknite nekatere stolpce v sprednji (najbolj levi) položajPrepirsetcolorder (mydt, c ("colB", "colC")) # colB je zdaj v položaju 1 in colC v položaju 2myt <- premestitev (myt, colB, colC)
Filtrirajte vrstice za številko vrstice nPodnabormydt2 <- mydt [n]myt2 <- rezina (myt, n)
Filter za zadnjo vrsticoPodnabormydt2 <- mydt [.N]myt2 <- rezina (myt, n ())
Filtriraj vrstice po pogojihPodnabor# V nekaterih primerih Setkey (mydt, colA, colB) pospeši delovanje # za logične teste na colA in colB; enako z drugimi stolpci

mydt2 <- mydt [logični izraz]

myt2 <- filter (myt, logični izraz)
Filtrirajte vrstice, kjer je colA enako string1 ali string2Podnabormydt2 <- mydt [colA% brada% c ("niz1", "niz2")]myt2 <- filter (myt, colA% v% c ("string1", "string2"))
Filtrirajte vrstice, kjer se colA ujema z regularnim izrazomPodnabormydt2 <- mydt [colA% like% "mypattern"]myt2 <- filter (myt, stringr :: str_detect (colA, "mypattern"))
Filtrirajte vrstice, kjer so vrednosti colA med 2 številkamaPodnabormydt2 <- mydt [colA% med% c (n1, n2)]myt2 <- filter (myt, med (colA, n1, n2))
Filter za prvih n vrstic po skupinahPodnabormydt2 <- mydt [, .SD [1: n], avtor = groupcol]myt2% group_by (groupcol)%>% rezina (1: n)
Filtrirajte vrstice za največjo vrednost po skupinahPodnabormydt2 <- mydt [, .SD [which.max (valcol)], avtor = groupcol]myt2% group_by (groupcol)%>% filter (valcol == max (valcol))
Izberite stolpec in vrnite rezultate kot vektorPodnabormyvec <- mydt [, ime]myvec <- pull (myt, colname)
Izberite več stolpcev, da ustvarite novo data.table (podatkovni okvir ali tibble za tidyverse)Podnabormydt2 <- mydt [, seznam (colA, colB)] # ALI

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

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

myt2 <- izberite (myt, colA, colB)
Izberite več stolpcev s spremenljivko, ki vsebuje imena stolpcevPodnabormy_col_names <- c ("colA", "colB")

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

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

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

myt2 <- izberite (myt, all_of (my_col_names))

Izberite več stolpcev in nekatere preimenujtePodnabormydt2 <- mydt [,. (novoime1 = col1, novoime2 = col2, col3)]myt2 <- izberite (myt, newname1 = col1, newname2 = col2, col3)
Izključite več stolpcevPodnabormydt2 <- mydt [, -c ("colA", "colB")] # ALI

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

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

mydt2 <- mydt [,! .. my_col_names]

myt2 <- izberite (myt, -c (colA, colB)) # ALI

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

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

Odstranite podvojene vrstice na podlagi vrednosti v več stolpcihPodnabormydt2 <- edinstven (mydt, by = c ("colA", "colB"))myt2 <- različen (myt, colA, colB, .keep_all = TRUE)
Štejte unikatne vrstice na podlagi več stolpcevPovzemiteunikatN (mydt, po = c ("colA", "colB"))nrow (razločen (myt, colA, colB))
Zaženite povzetke izračunov na podatkihPovzemitemydt2 <- mydt [, myfun (colA ...)]myt2% povzetek (ColName = myfun (colA ...))
Izvedite povzetke izračunov za podatke ene skupinePovzemitemydt2 <- mydt [, myfun (colA ...), avtor = groupcol] myt2%

group_by (groupcol)%>%

povzeti (

NewCol = myfun (colA ...)

)

Zaženite povzetke izračunov za podatke ene skupine in poimenujte nov stolpecPovzemitemydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), avtor = groupcol]myt2%

group_by (groupcol)%>%

povzeti (

NewCol = myfun (colA ...)

)

Izvedite povzetke izračunov za podatke po več skupinahPovzemitemydt2 <- mydt [, myfun (colA ...), avtor =. (groupcol1, groupcol2)]myt2%

group_by (groupcol1, groupcol2)%>%

povzeti (

NewCol = myfun (colA ...)

)

Zaženi povzetek izračuna za filtrirane podatke po več skupinahPovzemitemydt2 <- mydt [izraz filtra, myfun (colA), po =. (groupcol1, groupcol2)]myt2%

filter (izraz filtra)%>%

group_by (groupcol1, groupcol2)%>%

povzeti (

NewCol = myfun (colA), .groups = "obdrži"

)

Štetje števila vrstic po skupinahPovzemitemydt2 <- mydt [,. N, by = groupcol] # za eno skupino # ALI

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

myt2 <- count (myt, groupcol) # za eno skupino # ALI

myt2 <- count (myt, groupcol1, groupcol2)

Povzemite več stolpcev in vrnite rezultate v več stolpcihPovzemitemydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

povzeti (

čez (c (colA, colB), myfun)

)

Povzemite več stolpcev po skupinah in vrnite rezultate v več stolpcihPovzemitemydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

group_by (groupcol)%>%

povzetek (čez (c (colA, colB), myfun))

Dodajte stolpecIzračunajmydt [, MyNewCol: = myfun (colA)] myt%

mutiraj (

MyNewCol = myfun (colA)

)

Dodajte več stolpcev hkratiIzračunaj# uporabite katero koli funkcijo ali izraz

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

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

myt%

mutiraj (

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Stolpec dodajte z uporabo trenutnih in prejšnjih vrednosti iz drugega stolpca, na primer iskanje razlike med vrednostjo na datum v primerjavi s prejšnjim datumomIzračunajmydt [, Diff: = colA - premik (colA)]myt <- mutiraj (myt, Diff = colA - lag (colA))
Dodajte stolpec, ki se sklicuje na prejšnjo vrednost stolpca s strani skupineIzračunajmydt2 <- mydt [, Diff: = colA - premik (colA), po = groupcol]myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Dodajte stolpec z ID številkami vrstic po skupinahIzračunajmydt [, myid: = 1: .N, avtor = groupcol]myt% group_by (groupcol)%>% mutate (myid = row_number ())
Dodaj stolpec na podlagi več pogojev brez uporabe več stavkov if else (na primer SQL-ov CASE)Izračunaj# Potrebuje data.table različico 1.13 ali novejšo

# Všeč mi je vsak pogoj v novi vrstici, vendar to ni obvezno

mydt2 <- mydt [, NewCol: = fcase (

condition1, "Value1",

condition2, "Value2",

condition3, "Value3",

default = "Other" # vrednost za vse ostalo

)]

myt2%

mutiraj (

NewCol = case_when (

pogoj1 ~ "Vrednost1",

condition2 ~ "Vrednost2",

condition3 ~ "Vrednost3",

TRUE ~ "Drugo"

)

)

Dodajanje stolpca z uporabo vrsticeIzračunajmydt [, newcol: = myfun (colB, colC, colD), avtor = 1: nrow (mydt)]

# ali če ima colA vse edinstvene vrednosti

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

myt%

rowwise ()%>%

mutiraj (

newcol = myfun (colB, colC, colD)

)

# ali

myt%

rowwise ()%>%

mutiraj (

#use dplyr select sintaksa:

newcol = myfun (c_across (colB: colD))

)

Združite dva nabora podatkov za več kot en stolpec; obdrži vse v naboru1, vendar le ujemanja v naboru2Pridružite semydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] # ALI

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

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

myt <- left_join (df1, df2, by = c ("df1col" = "df2col"))
Združite dva nabora podatkov z več kot enim stolpcem - vse naj ostanejo v nizu1, vendar le ujemanja v nizu2Pridružite semydt <- spajanje (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) # ALI

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Združite dva nabora podatkov z enim skupnim stolpcem; hranite samo tekmePridružite semydt <- spajanje (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2")myt <- inner_join (df1, df2, by = c ("df1col" = "df2col"))
Združite dva nabora podatkov v en skupni stolpec in obdržite vse podatke v obeh naborih, ne glede na to, ali obstajajo ujemanjaPridružite semydt <- spajanje (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", vse = TRUE)myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Združite dva nabora podatkov tako, da dodate vrstice iz enega na dno drugegaPridružite semydt_joined <- rbindlist (seznam (mydt, mydt2))myt_joined <- bind_rows (myt, myt2)
Preoblikujte podatke v široko v dolgoPreoblikovanjemydt_long <- stopi (mydt, measure.vars = c ("col1", "col2", "col3"), variable.name = "NewCategoryColName", value.name = "NewValueColName")myt_long <- pivot_longer (myt, cols = start_with ("col"), names_to = "NewCategoryColName", values_to = "NewValueColName")
Preoblikujte podatke v dolžino v širinoPreoblikovanjemydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName")myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Veriga več izrazovPrepirmydt [expr1] [expr2]myt%

izraz1%>%

izraz2

Izvozite podatke v datoteko CSVIzvozifwrite (mydt, "myfile.csv")write_csv (myt, "myfile.csv")
V obstoječo datoteko CSV dodajte vrsticeIzvozifwrite (mydt2, "myfile.csv", dodaj = TRUE)vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
Izvozite podatke v stisnjeno datoteko CSVIzvozifwrite (mydt, "myfile.csv.gz", stisni = "gzip")vroom :: vroom_write (myt, "myfile2.csv.gz")

O data.table se lahko še veliko naučite! Za nekaj osnov data.table si oglejte moj petminutni uvodni video:

Na koncu pa ima spletno mesto data.table veliko več informacij in nasvetov, kot je uporaba nastavljena tipka () in drugi nasveti za indeksiranje.

$config[zx-auto] not found$config[zx-overlay] not found