Ohjelmointi

Lopullinen R-data.table-huijausarkki

Nopeus. Tiivis syntaksi. Taaksepäin yhteensopivuus.

Mutta erityisesti nopeus.

Nämä ovat joitain ominaisuuksia, jotka tekevät R: n datasta. Taulukon houkuttelevan faneilleen.

Ja vaikka olisitkin vahvistettu siisti versio (kuten minä olen), data.table voi olla hyödyllinen lisäys R-työkalupakkiisi - varsinkin kun työskentelet suurten tietojoukkojen kanssa, Shiny-sovelluksessa tai pakettitoiminnossa.

Tämä R data.table -pelin huijausarkki eroaa monista muista, koska se on vuorovaikutteinen. Voit hakea tiettyä ilmausta, kuten lisää sarake tai tietyn tyyppisen tehtäväryhmän mukaan Alajoukko tai Muotoile uudelleen. Lisäksi koska tämä huijausarkki sisältää tidyverse "translation" -koodin, voit myös etsiä suosikkiversiota kuten muuttua tai peräkkäin.

Rekisteröityneet käyttäjät voivat ladata tämän interaktiivisen taulukon laajennetun version käytettäväksi omissa järjestelmissään! Rekisteröityminen on ilmaista.

Hae data.table- ja tidoververs-tehtäviä ja koodia

TehtäväTyyppidata.table-koodiSiisti koodi
Lue CSV-tiedostossaTuontimydt <- fread ("myfile.csv")myt <- read_csv ("omatiedostot.csv") #OR myt <- vroom :: vroom ("myfile.csv")
Tuo CSV-tiedoston ensimmäinen x rivien määräTuontimydt_x <- fread ("myfile.csv", nrows = x)myt_x <- luku_csv ("omatiedosto.csv", n_max = x)
Tuo CSV-tiedostosta vain ne rivit, jotka vastaavat tiettyä malliaTuontimydt_pattern <- fread ("grep 'mypattern' myfile.csv")myt_pattern <- vroom :: vroom (pipe ("grep 'mypattern' myfile.csv"))
Tuo .gz-pakattu tiedostoTuontimydt <- fread ("myfile.gz")myt <- vroom :: vroom ("myfile.gz")
Tuo pakattu a.zip-tiedostotuontimydt <- fread (cmd = 'pura -cq myfile.zip')myt <- lue_csv ("myfile.zip")
Luo tietotaulukko olemassa olevasta tietokehyksestä (tibeversioTuontimydt <- as.data.table (mydf) # OR

setDT (mydf)

myt <- as_tibble (mydf)
Muuta tietoja. Taulukko paikallaan tekemättä kopiotaRähinämikä tahansa funktio, joka alkaa joukosta, kuten setkey (mydt, mycol) tai suluissa oleva operaattori: =ei sovellettavissa
Järjestä rivit useiden sarakearvojen perusteellaRähinämydt2 <- mydt [järjestys (colA, -colB)] # OR

setorder (mydt, colA, -colB)

myt <- järjestää (myt, colA, -colB)
Nimeä sarakkeet uudelleenRähinäsetnames (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB'))myt <- nimeä uudelleen (myt, NewColA = colA, NewColB = colB)
Sarakkeiden järjestys: Siirrä joitain sarakkeita etuasemaan (vasen eniten)Rähinäsetcolorder (mydt, c ("colB", "colC")) # colB nyt asennossa 1 ja colC paikassa 2myt <- siirrä (myt, colB, colC)
Suodata rivit rivinumerolle nAlajoukkomydt2 <- mydt [n]myt2 <- viipale (myt, n)
Suodata viimeinen riviAlajoukkomydt2 <- mydt [.N]myt2 <- viipale (myt, n ())
Suodata rivit ehdon mukaanAlajoukko# Joissakin tapauksissa setkey (mydt, colA, colB) nopeuttaa suorituskykyä # colA: n ja colB: n loogisten testien yhteydessä; sama muiden sarakkeiden kanssa

mydt2 <- mydt [looginen lauseke]

myt2 <- suodatin (myt, looginen lauseke)
Suodata rivit, joissa colA on merkkijono1 tai merkkijono2Alajoukkomydt2 <- mydt [colA% leuka% c ("merkkijono1", "merkkijono2")]myt2 <- suodatin (myt, colA%% c: ssä ("merkkijono1", "merkkijono2"))
Suodata rivit, joissa colA vastaa säännöllistä lausekettaAlajoukkomydt2 <- mydt [colA% kuten% "mypattern"]myt2 <- suodatin (myt, stringr :: str_detect (colA, "mypattern"))
Suodata rivit, joissa colA-arvot ovat kahden numeron välilläAlajoukkomydt2 <- mydt [colA% välillä% c (n1, n2)]myt2 <- suodatin (myt, välillä (colA, n1, n2))
Suodata ensimmäiset n riviä ryhmittäinAlajoukkomydt2 <- mydt [, .SD [1: n], kirjoittanut = groupcol]myt2% group_by (groupcol)%>% slice (1: n)
Suodata rivit enimmäisarvolle ryhmittäinAlajoukkomydt2 <- mydt [, .SD [mikä.max (valcol)], kirjoittanut = ryhmäkolmi]myt2% group_by (groupcol)%>% filter (valcol == max (valcol))
Valitse sarake ja palauta tulokset vektorinaAlajoukkomyvec <- mydt [, colname]myvec <- vedä (myt, colname)
Valitse useita sarakkeita luodaksesi uuden data.table-taulukon (tietokehys tai tibble for tidyverse)Alajoukkomydt2 <- mydt [, luettelo (colA, colB)] # OR

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

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

myt2 <- valitse (myt, colA, colB)
Valitse useita sarakkeita käyttämällä muuttujaa, joka sisältää sarakkeiden nimetAlajoukkomy_col_names <- c ("colA", "colB")

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

mydt2 <- mydt [, my_col_names, with = EPÄTOSI]

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

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

Valitse useita sarakkeita ja nimeä jotkut uudelleenAlajoukkomydt2 <- mydt [,. (uusi nimi1 = col1, uusi nimi2 = col2, col3)]myt2 <- valitse (myt, newname1 = col1, newname2 = col2, col3)
Sulje pois useita sarakkeitaAlajoukkomydt2 <- mydt [, -c ("colA", "colB")] # OR

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

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

mydt2 <- mydt [,! .. my_col_names]

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

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

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

Poista päällekkäiset rivit useiden sarakkeiden arvojen perusteellaAlajoukkomydt2 <- ainutlaatuinen (mydt, kirjoittanut = c ("colA", "colB"))myt2 <- erillinen (myt, colA, colB, .keep_all = TOSI)
Laske ainutlaatuiset rivit useiden sarakkeiden perusteellaTee yhteenvetoainutlaatuinenN (mydt, kirjoittanut = c ("colA", "colB"))nrow (erillinen (myt, colA, colB))
Suorita tietojen yhteenvetolaskelmatTee yhteenvetomydt2 <- mydt [, myfun (colA ...)]myt2% yhteenveto (ColName = myfun (colA ...))
Suorita yhteenvetolaskelmat yhden ryhmän tiedoistaTee yhteenvetomydt2 <- mydt [, myfun (colA ...), kirjoittanut = groupcol] myyt2%

group_by (groupcol)%>%

yhteenveto (

NewCol = myfun (colA ...)

)

Suorita tietojen yhteenvetolaskelmat yhden ryhmän mukaan ja nimeä uusi sarakeTee yhteenvetomydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), kirjoittanut = groupcol]myyt2%

group_by (groupcol)%>%

yhteenveto (

NewCol = myfun (colA ...)

)

Suorita yhteenvetolaskelmat useille ryhmilleTee yhteenvetomydt2 <- mydt [, myfun (colA ...), kirjoittanut =. (groupcol1, groupcol2)]myyt2%

group_by (groupcol1, groupcol2)%>%

yhteenveto (

NewCol = myfun (colA ...)

)

Suorita suodatettujen tietojen yhteenvetolaskenta useiden ryhmien mukaanTee yhteenvetomydt2 <- mydt [suodata lauseke, myfun (colA), kirjoittanut =. (ryhmäkolmi1, ryhmäkolmi2)]myyt2%

suodatin (suodattimen lauseke)%>%

group_by (groupcol1, groupcol2)%>%

yhteenveto (

NewCol = myfun (colA), .groups = "säilytä"

)

Laske rivien määrä ryhmittäinTee yhteenvetomydt2 <- mydt [,. N, kirjoittanut = groupcol] # yhdelle ryhmälle # OR

mydt2 <- mydt [, .N, kirjoittanut =. (ryhmäkolmi1, ryhmäkolmi2)]

myt2 <- count (myt, groupcol) # yhdelle ryhmälle # OR

myt2 <- määrä (myt, ryhmäkolmi1, ryhmäkolko2)

Tee yhteenveto useista sarakkeista ja palauta tulokset useisiin sarakkeisiinTee yhteenvetomydt2 <- mydt [, lapply (.SD, myfun),

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

myyt2%

yhteenveto (

poikki (c (colA, colB), myfun)

)

Tee yhteenveto useista sarakkeista ryhmittäin ja palauta tulokset useisiin sarakkeisiinTee yhteenvetomydt2 <- mydt [, lapply (.SD, myfun),

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

myyt2%

group_by (groupcol)%>%

yhteenveto (poikki (c (colA, colB), myfun))

Lisää sarakeLaskeamydt [, MyNewCol: = myfun (colA)] my%

muuttua(

MyNewCol = myfun (colA)

)

Lisää useita sarakkeita kerrallaLaskea# käytä mitä tahansa toimintoa tai lauseketta

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

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

my%

muuttua(

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Lisää sarake käyttämällä toisen sarakkeen nykyisiä ja edellisiä arvoja, kuten etsimällä eroa päivämäärän arvon ja edellisen päivämäärän välilläLaskeamydt [, Diff: = colA - muutos (colA)]myt <- mutaatio (myt, Diff = colA - viive (colA))
Lisää sarake, joka viittaa ryhmän sarakkeen edelliseen arvoonLaskeamydt2 <- mydt [, Diff: = colA - shift (colA), kirjoittanut = ryhmäkolmi]myt2% group_by (groupcol)%>% mutaatio (Diff = colA - lag (colA))
Lisää sarake rivin tunnistenumeroilla ryhmittäinLaskeamydt [, myid: = 1: .N, kirjoittanut = groupcol]myt% group_by (groupcol)%>% mutatoi (myid = rivinumero_) ()
Lisää sarake useiden ehtojen perusteella käyttämättä useita if else -käskyjä (kuten SQL: n CASE)Laskea# Tarvitsee data.table-version 1.13 tai uudemman

# Pidän jokaisesta ehdosta uudella rivillä, mutta sitä ei vaadita

mydt2 <- mydt [, NewCol: = fcase (

ehto1, "Arvo1",

ehto2, "Arvo2",

ehto3, "Arvo3",

oletus = "Muu" # arvo kaikelle muulle

)]

myyt2%

muuttua(

NewCol = tapaus_milloin (

ehto1 ~ "Arvo1",

ehto2 ~ "Arvo2",

ehto3 ~ "Arvo3",

TOSI ~ "Muu"

)

)

Lisää sarake käyttämällä riviäLaskeamydt [, newcol: = myfun (colB, colC, colD), kirjoittanut = 1: nrow (mydt)]

# tai jos colA: lla on kaikki ainutlaatuiset arvot

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

my%

peräkkäin ()%>%

muuttua(

newcol = myfun (colB, colC, colD)

)

# tai

my%

peräkkäin ()%>%

muuttua(

#use dplyr valitse syntakse:

newcol = myfun (c_across (colB: colD))

)

Yhdistä kaksi tietojoukkoa useammalla kuin yhdellä sarakkeella; pidä kaikki sarjassa1, mutta vain ottelut sarjassa2Liittyä seuraanmydt <- dt2 [dt1, päällä = c ("dt2col" = "dt1col")] # OR

mydt <- yhdistäminen (dt1, dt2, by.x = "dt1col", by.y = "dt2col", kaikki.x = TOSI) # OR

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

myt <- left_join (df1, df2, kirjoittanut = c ("df1col" = "df2col"))
Yhdistä 2 tietojoukkoa useammalla kuin yhdellä sarakkeella - pidä kaikki sarjassa1, mutta vain sarjassa2Liittyä seuraanmydt <- yhdistäminen (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), kaikki.x = TOSI, kaikki.y = EPÄTOSI ) TAI

asetusavain (dt1, dt1colA, dt1colB)

asetusavain (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- vasen_liity (df1, df2, = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Yhdistä kaksi tietojoukkoa yhdellä sarakkeella; pitää vain otteluitaLiittyä seuraanmydt <- yhdistäminen (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2")myt <- sisäinen_liity (df1, df2, = c ("df1col" = "df2col"))
Yhdistä kaksi tietojoukkoa yhdellä sarakkeella ja pidä kaikki tiedot molemmissa sarjoissa riippumatta siitä, onko otteluitaLiittyä seuraanmydt <- yhdistäminen (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", kaikki = TOSI)myt <- full_join (df1, df2, kirjoittanut = c ("df1col" = "df2col"))
Yhdistä kaksi tietojoukkoa lisäämällä rivejä toisesta loppuunLiittyä seuraanmydt_joined <- rbindlist (list (mydt, mydt2))myt_joined <- bind_rows (myt, myt2)
Muuta tietoja laajasta pitkäänMuotoile uudelleenmydt_long <- sula (mydt, toimenpide.vars = c ("col1", "col2", "col3"), muuttuja.nimi = "NewCategoryColName", arvo.nimi = "NewValueColName")myt_long <- pivot_longer (myt, cols = alkaa_with ("col"), names_to = "NewCategoryColName", arvot_to = "NewValueColName")
Muuta tietoja pitkältä laajalleMuotoile uudelleenmydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName")myt_wide <- pivot_wider (myt, nimet_alkaen = col1, arvot_luku = ValueColName)
Ketju useita lausekkeitaRähinämydt [lauseke1] [lauseke2]my%

lauseke1%>%

lauseke 2

Vie tiedot CSV-tiedostoonViedäfwrite (mydt, "myfile.csv")write_csv (myt, "omatiedosto.csv")
Liitä rivit olemassa olevaan CSV-tiedostoonViedäfwrite (mydt2, "myfile.csv", liite = TOSI)vroom :: vroom_write (myt2, "myfile.csv", delim = ",", liite = TOSI)
Vie tiedot pakattuun CSV-tiedostoonViedäfwrite (mydt, "myfile.csv.gz", compress = "gzip")vroom :: vroom_write (myt, "myfile2.csv.gz")

Datasta on paljon enemmän opittavaa. Taulukko! Katso joitain data.table-taulukon perusteita viiden minuutin esittelyvideostani:

Lopuksi data.table-verkkosivustolla on paljon lisätietoja ja vinkkejä, kuten käyttö asetusavain () ja muita indeksointivinkkejä.