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
Oppgave | Type | datatabellkode | Tidyverse Code |
---|---|---|---|
Les i CSV-fil | Import | mydt <- fread ("myfile.csv") | myt <- read_csv ("myfile.csv") #OR myt <- vroom :: vroom ("myfile.csv") |
Importer det første x antall rader i en CSV-fil | Import | mydt_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ønster | Import | mydt_pattern <- fread ("grep 'mypattern' myfile.csv") | myt_pattern <- vroom :: vroom (pipe ("grep 'mypattern' myfile.csv")) |
Importer en komprimert .gz-fil | Import | mydt <- fread ("myfile.gz") | myt <- vroom :: vroom ("myfile.gz") |
Importer en komprimert.zip-fil | import | mydt <- fread (cmd = 'unzip -cq myfile.zip') | myt <- read_csv ("myfile.zip") |
Lag datatabell fra eksisterende dataramme (tibble for tidyverse) | Import | mydt <- as.data.table (mydf) #OR setDT (mydf) | myt <- as_tibble (mydf) |
Endre data.tabellen på plass uten å lage en kopi | Wrangle | hvilken som helst funksjon som begynner med sett som setkey (mydt, mycol) eller ved å bruke: = operatøren innen parentes | ikke aktuelt |
Bestill rader basert på flere kolonneverdier | Wrangle | mydt2 <- mydt [order (colA, -colB)] #OR setorder (mydt, colA, -colB) | myt <- ordne (myt, colA, -colB) |
Gi kolonnene nytt navn | Wrangle | setnames (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) | Wrangle | setcolorder (mydt, c ("colB", "colC")) # colB nå i posisjon 1 og colC i posisjon 2 | myt <- flytt (myt, colB, colC) |
Filtrer rader for radnummer n | Delsett | mydt2 <- mydt [n] | myt2 <- skive (myt, n) |
Filtrer for siste rad | Delsett | mydt2 <- mydt [.N] | myt2 <- skive (myt, n ()) |
Filtrer rader etter tilstand | Delsett | # 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 streng2 | Delsett | mydt2 <- mydt [colA% chin% c ("string1", "string2")] | myt2 <- filter (myt, colA% i% c ("string1", "string2")) |
Filtrer rader der colA samsvarer med et vanlig uttrykk | Delsett | mydt2 <- mydt [colA% som% "mypattern"] | myt2 <- filter (myt, stringr :: str_detect (colA, "mypattern")) |
Filtrer rader der colA-verdier er mellom 2 tall | Delsett | mydt2 <- mydt [colA% mellom% c (n1, n2)] | myt2 <- filter (myt, mellom (colA, n1, n2)) |
Filtrer for første n rad etter gruppe | Delsett | mydt2 <- mydt [, .SD [1: n], av = groupcol] | myt2% group_by (groupcol)%>% slice (1: n) |
Filtrer rader for maksimal verdi etter gruppe | Delsett | mydt2 <- mydt [, .SD [which.max (valcol)], av = groupcol] | myt2% group_by (groupcol)%>% filter (valcol == max (valcol)) |
Velg kolonne og returner resultatene som en vektor | Delsett | myvec <- mydt [, colname] | myvec <- pull (myt, colname) |
Velg flere kolonner for å lage en ny data.table (dataramme eller tibble for tidyverse) | Delsett | mydt2 <- 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 kolonnenavnene | Delsett | 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 <- velg (myt, all_of (my_col_names)) |
Velg flere kolonner og gi nytt navn til noen | Delsett | mydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)] | myt2 <- velg (myt, newname1 = col1, newname2 = col2, col3) |
Ekskluder flere kolonner | Delsett | mydt2 <- 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 kolonner | Delsett | mydt2 <- unik (mydt, by = c ("colA", "colB")) | myt2 <- distinkt (myt, colA, colB, .keep_all = TRUE) |
Telle unike rader basert på flere kolonner | Oppsummer | uniqueN (mydt, by = c ("colA", "colB")) | nrow (distinkt (myt, colA, colB)) |
Kjør sammendragsberegninger på data | Oppsummer | mydt2 <- mydt [, myfun (colA ...)] | myt2% oppsummer (ColName = myfun (colA ...)) |
Kjør sammendragsberegninger på data av en gruppe | Oppsummer | mydt2 <- 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 kolonne | Oppsummer | mydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), av = groupcol] | myt2% group_by (groupcol)%>% oppsummere ( NewCol = myfun (colA ...) ) |
Kjør sammendragsberegninger på data fra flere grupper | Oppsummer | mydt2 <- mydt [, myfun (colA ...), av =. (groupcol1, groupcol2)] | myt2% group_by (groupcol1, groupcol2)%>% oppsummere ( NewCol = myfun (colA ...) ) |
Kjør sammendragsberegning på filtrerte data etter flere grupper | Oppsummer | mydt2 <- mydt [filteruttrykk, myfun (colA), av =. (groupcol1, groupcol2)] | myt2% filter (filteruttrykk)%>% group_by (groupcol1, groupcol2)%>% oppsummere ( NewCol = myfun (colA), .groups = "keep" ) |
Tell antall rader etter grupper | Oppsummer | mydt2 <- 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 kolonner | Oppsummer | mydt2 <- 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 kolonner | Oppsummer | mydt2 <- mydt [, lapply (.SD, myfun), .Sdcols = c ("colA", "colB"), etter = groupcol] | myt2% group_by (groupcol)%>% oppsummere (over (c (colA, colB), myfun)) |
Legg til en kolonne | Regne ut | mydt [, MyNewCol: = myfun (colA)] | myt% mutere ( MyNewCol = myfun (colA) ) |
Legg til flere kolonner samtidig | Regne 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 ut | mydt [, Diff: = colA - shift (colA)] | myt <- mutere (myt, Diff = colA - lag (colA)) |
Legg til kolonne som refererer til forrige verdi av en kolonne av en gruppe | Regne ut | mydt2 <- mydt [, Diff: = colA - shift (colA), by = groupcol] | myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA)) |
Legg til kolonne med rad-ID-nummer etter gruppe | Regne ut | mydt [, 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 rad | Regne ut | mydt [, 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 sett2 | Bli med | mydt <- 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 sett2 | Bli med | mydt <- 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 kamper | Bli med | mydt <- 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 samsvar | Bli med | mydt <- 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 annen | Bli med | mydt_joined <- rbindlist (liste (mydt, mydt2)) | myt_joined <- bind_rows (myt, myt2) |
Omform data bredt til langt | Gjør om | mydt_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 bred | Gjør om | mydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName") | myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName) |
Kjed flere uttrykk | Wrangle | mydt [expr1] [expr2] | myt% ekspr1%>% ekspr2 |
Eksporter data til en CSV-fil | Eksport | fwrite (mydt, "myfile.csv") | write_csv (myt, "myfile.csv") |
Legg til rader i en eksisterende CSV-fil | Eksport | fwrite (mydt2, "myfile.csv", append = TRUE) | vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE) |
Eksporter data til en komprimert CSV-fil | Eksport | fwrite (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.