Programmering

Det ultimate juksearket for R-data. Tabell

Hastighet. Kortfattet syntaks. Bakoverkompatibilitet.

Men spesielt fart.

Dette er noen av funksjonene som gjør R’s data.table tiltalende for fansen.

Og selv om du er en bekreftet tidyverse bruker (som jeg er), kan data.table være et nyttig tillegg til R-verktøysettet ditt - spesielt når du arbeider med store datasett, i en skinnende app eller i en pakkefunksjon.

Dette ultimative juksearket for R-data. Tabell er forskjellig fra mange andre fordi det er interaktiv. Du kan søke etter en bestemt setning som legg til kolonne eller av en type oppgavegruppe som Delsett eller Gjør om. I tillegg, fordi dette juksearket inneholder tidyverse "oversettelse" -kode, kan du også søke etter et favoritt dplyr-verb som mutere eller radvis.

Registrerte brukere kan laste ned en utvidet versjon av denne interaktive tabellen for bruk på egne systemer! Registrering er gratis.

Søk data.table og tidyverse oppgaver og kode

OppgaveTypedatatabellkodeTidyverse Code
Les i CSV-filImportmydt <- fread ("myfile.csv")myt <- read_csv ("myfile.csv") #OR myt <- vroom :: vroom ("myfile.csv")
Importer det første x antall rader i en CSV-filImportmydt_x <- fread ("myfile.csv", nrows = x)myt_x <- read_csv ("myfile.csv", n_max = x)
Importer bare de radene fra en CSV-fil som samsvarer med et bestemt mønsterImportmydt_pattern <- fread ("grep 'mypattern' myfile.csv")myt_pattern <- vroom :: vroom (pipe ("grep 'mypattern' myfile.csv"))
Importer en komprimert .gz-filImportmydt <- fread ("myfile.gz")myt <- vroom :: vroom ("myfile.gz")
Importer en komprimert.zip-filimportmydt <- fread (cmd = 'unzip -cq myfile.zip')myt <- read_csv ("myfile.zip")
Lag datatabell fra eksisterende dataramme (tibble for tidyverse)Importmydt <- as.data.table (mydf) #OR

setDT (mydf)

myt <- as_tibble (mydf)
Endre data.tabellen på plass uten å lage en kopiWranglehvilken som helst funksjon som begynner med sett som setkey (mydt, mycol) eller ved å bruke: = operatøren innen parentesikke aktuelt
Bestill rader basert på flere kolonneverdierWranglemydt2 <- mydt [order (colA, -colB)] #OR

setorder (mydt, colA, -colB)

myt <- ordne (myt, colA, -colB)
Gi kolonnene nytt navnWranglesetnames (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB'))myt <- endre navn (myt, NewColA = colA, NewColB = colB)
Omorganisere kolonner: Flytt noen kolonner til posisjonen foran (lengst til venstre)Wranglesetcolorder (mydt, c ("colB", "colC")) # colB nå i posisjon 1 og colC i posisjon 2myt <- flytt (myt, colB, colC)
Filtrer rader for radnummer nDelsettmydt2 <- mydt [n]myt2 <- skive (myt, n)
Filtrer for siste radDelsettmydt2 <- mydt [.N]myt2 <- skive (myt, n ())
Filtrer rader etter tilstandDelsett# I noen tilfeller vil setkey (mydt, colA, colB) øke ytelsen # for logiske tester på colA og colB; det samme med andre kolonner

mydt2 <- mydt [logisk uttrykk]

myt2 <- filter (myt, logisk uttrykk)
Filtrer rader der colA er lik streng1 eller streng2Delsettmydt2 <- mydt [colA% chin% c ("string1", "string2")]myt2 <- filter (myt, colA% i% c ("string1", "string2"))
Filtrer rader der colA samsvarer med et vanlig uttrykkDelsettmydt2 <- mydt [colA% som% "mypattern"]myt2 <- filter (myt, stringr :: str_detect (colA, "mypattern"))
Filtrer rader der colA-verdier er mellom 2 tallDelsettmydt2 <- mydt [colA% mellom% c (n1, n2)]myt2 <- filter (myt, mellom (colA, n1, n2))
Filtrer for første n rad etter gruppeDelsettmydt2 <- mydt [, .SD [1: n], av = groupcol]myt2% group_by (groupcol)%>% slice (1: n)
Filtrer rader for maksimal verdi etter gruppeDelsettmydt2 <- mydt [, .SD [which.max (valcol)], av = groupcol]myt2% group_by (groupcol)%>% filter (valcol == max (valcol))
Velg kolonne og returner resultatene som en vektorDelsettmyvec <- mydt [, colname]myvec <- pull (myt, colname)
Velg flere kolonner for å lage en ny data.table (dataramme eller tibble for tidyverse)Delsettmydt2 <- mydt [, liste (colA, colB)] #OR

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

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

myt2 <- velg (myt, colA, colB)
Velg flere kolonner ved hjelp av en variabel som inneholder kolonnenavneneDelsettmy_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 <- velg (myt, all_of (my_col_names))

Velg flere kolonner og gi nytt navn til noenDelsettmydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)]myt2 <- velg (myt, newname1 = col1, newname2 = col2, col3)
Ekskluder flere kolonnerDelsettmydt2 <- mydt [, -c ("colA", "colB")] #OR

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

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

mydt2 <- mydt [,! .. my_col_names]

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

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

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

Fjern dupliserte rader basert på verdier i flere kolonnerDelsettmydt2 <- unik (mydt, by = c ("colA", "colB"))myt2 <- distinkt (myt, colA, colB, .keep_all = TRUE)
Telle unike rader basert på flere kolonnerOppsummeruniqueN (mydt, by = c ("colA", "colB"))nrow (distinkt (myt, colA, colB))
Kjør sammendragsberegninger på dataOppsummermydt2 <- mydt [, myfun (colA ...)]myt2% oppsummer (ColName = myfun (colA ...))
Kjør sammendragsberegninger på data av en gruppeOppsummermydt2 <- mydt [, myfun (colA ...), av = groupcol] myt2%

group_by (groupcol)%>%

oppsummere (

NewCol = myfun (colA ...)

)

Kjør sammendragsberegninger på data etter en gruppe, og gi navn til ny kolonneOppsummermydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), av = groupcol]myt2%

group_by (groupcol)%>%

oppsummere (

NewCol = myfun (colA ...)

)

Kjør sammendragsberegninger på data fra flere grupperOppsummermydt2 <- mydt [, myfun (colA ...), av =. (groupcol1, groupcol2)]myt2%

group_by (groupcol1, groupcol2)%>%

oppsummere (

NewCol = myfun (colA ...)

)

Kjør sammendragsberegning på filtrerte data etter flere grupperOppsummermydt2 <- mydt [filteruttrykk, myfun (colA), av =. (groupcol1, groupcol2)]myt2%

filter (filteruttrykk)%>%

group_by (groupcol1, groupcol2)%>%

oppsummere (

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

)

Tell antall rader etter grupperOppsummermydt2 <- mydt [,. N, av = groupcol] # for en gruppe # OR

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

myt2 <- count (myt, groupcol) #for one group #OR

myt2 <- count (myt, groupcol1, groupcol2)

Oppsummer flere kolonner og returner resultatene i flere kolonnerOppsummermydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

oppsummere (

over (c (colA, colB), myfun)

)

Oppsummer flere kolonner etter gruppe og returner resultatene i flere kolonnerOppsummermydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

group_by (groupcol)%>%

oppsummere (over (c (colA, colB), myfun))

Legg til en kolonneRegne utmydt [, MyNewCol: = myfun (colA)] myt%

mutere (

MyNewCol = myfun (colA)

)

Legg til flere kolonner samtidigRegne ut# bruk hvilken som helst funksjon eller uttrykk

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

)

Legg til kolonne ved hjelp av gjeldende og tidligere verdier fra en annen kolonne, for eksempel å finne forskjellen mellom verdien på en dato vs.Regne utmydt [, Diff: = colA - shift (colA)]myt <- mutere (myt, Diff = colA - lag (colA))
Legg til kolonne som refererer til forrige verdi av en kolonne av en gruppeRegne utmydt2 <- mydt [, Diff: = colA - shift (colA), by = groupcol]myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Legg til kolonne med rad-ID-nummer etter gruppeRegne utmydt [, myid: = 1: .N, av = groupcol]myt% group_by (groupcol)%>% mutate (myid = row_number ())
Legg til kolonne basert på flere forhold uten å bruke flere hvis annet uttalelser (som SQLs CASE)Regne ut# Trenger data.table versjon 1.13 eller nyere

# Jeg liker hver tilstand på en ny linje, men det er ikke nødvendig

mydt2 <- mydt [, NewCol: = fcase (

betingelse1, "Verdi1",

betingelse2, "Verdi2",

betingelse3, "Verdi3",

default = "Annet" # verdi for alt annet

)]

myt2%

mutere (

NewCol = case_when (

betingelse1 ~ "Verdi1",

betingelse2 ~ "Verdi2",

betingelse3 ~ "Verdi3",

SANT ~ "Annet"

)

)

Legg til kolonne via drift etter radRegne utmydt [, newcol: = myfun (colB, colC, colD), av = 1: nrow (mydt)]

# eller hvis colA har alle unike verdier

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

myt%

radvis ()%>%

mutere (

newcol = myfun (colB, colC, colD)

)

# eller

myt%

radvis ()%>%

mutere (

# bruk dplyr velg syntaks:

newcol = myfun (c_across (colB: colD))

)

Bli med i to datasett med mer enn en kolonne; hold alt i sett1, men bare kamper i sett2Bli medmydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] #OR

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

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

myt <- left_join (df1, df2, by = c ("df1col" = "df2col"))
Bli med i to datasett med mer enn en kolonne - hold alt i sett1, men bare samsvar i sett2Bli medmydt <- flett (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) # ELLER

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Bli med i to datasett med en vanlig kolonne; bare holde kamperBli medmydt <- flett (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2")myt <- inner_join (df1, df2, by = c ("df1col" = "df2col"))
Bli med i to datasett med en felles kolonne, og hold alle dataene i begge settene, uansett om det er samsvarBli medmydt <- flett (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", alt = SANT)myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Kombiner to datasett ved å legge til rader fra en til bunnen av en annenBli medmydt_joined <- rbindlist (liste (mydt, mydt2))myt_joined <- bind_rows (myt, myt2)
Omform data bredt til langtGjør ommydt_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 bredGjør ommydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName")myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Kjed flere uttrykkWranglemydt [expr1] [expr2]myt%

ekspr1%>%

ekspr2

Eksporter data til en CSV-filEksportfwrite (mydt, "myfile.csv")write_csv (myt, "myfile.csv")
Legg til rader i en eksisterende CSV-filEksportfwrite (mydt2, "myfile.csv", append = TRUE)vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
Eksporter data til en komprimert CSV-filEksportfwrite (mydt, "myfile.csv.gz", compress = "gzip")vroom :: vroom_write (myt, "myfile2.csv.gz")

Det er mye mer å lære om data.table! For noen grunnleggende om data.table, sjekk ut min introduksjonsvideo på fem minutter:

Til slutt har data.table-nettstedet mye mer informasjon og tips, for eksempel bruk setkey () og andre indekseringstips.

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