Programiranje

R data.tabela tabel in operaterji, ki bi jih morali poznati

Koda data.table postane bolj učinkovita in elegantna, ko izkoristite njene posebne simbole in funkcije. S tem v mislih bomo preučili nekaj posebnih načinov za podnabor, štetje in ustvarjanje novih stolpcev.

Za to predstavitev bom uporabil podatke iz raziskave razvijalcev Stack Overflow 2019 z okoli 90.000 odgovori. Če želite nadaljevati, lahko podatke prenesete iz Stack Overflow.

Če paket data.table ni nameščen v vašem sistemu, ga namestite iz programa CRAN in ga nato naložite kot običajno knjižnica (data.table). Za začetek boste morda želeli prebrati samo prvih nekaj vrstic nabora podatkov, da boste lažje preučili strukturo podatkov. To lahko storite s pomočjo data.table's fread () funkcijo in nrows prepir. Prebral bom v 10 vrsticah:

data_sample <- fread ("data / survey_results_public.csv", nrows = 10)

Kot boste videli, je treba pregledati 85 stolpcev. (Če želite vedeti, kaj pomenijo vsi stolpci, so v prenosu datoteke s podatkovno shemo in PDF prvotne ankete.)

Za branje vseh podatkov bom uporabil:

mydt <- fread ("data / survey_results_public.csv")

Nato bom ustvaril novo podatkovno tabelo z le nekaj stolpci za lažje delo in ogled rezultatov. Opomnik, da data.table uporablja to osnovno sintakso:

mydt [i, j, avtor]

Uvod v paketu data.table pravi, da je to treba brati kot »vzemi dt, podmnožico ali preuredi vrstice z i, izračunaj j, razvrščeno po.« Upoštevajte, da sta i in j podobna razvrščanju nosilcev osnovnega R: najprej vrstice, drugi stolpci. Torej sem za operacije, ki bi jih izvajali v vrsticah (izbira vrstic glede na številke vrstic ali pogoje); j je tisto, kar bi naredili s stolpci (izberite stolpce ali ustvarite nove stolpce iz izračunov). Upoštevajte pa tudi, da lahko v oklepajih data.table naredite veliko več kot osnovni podatkovni okvir R. In razdelek »po« je nov za data.table.

Ker sem izbiranje stolpca, ta koda gre na mesto "j", kar pomeni, da oklepaji najprej potrebujejo vejico, da ostane mesto "i" prazno:

mydt [, j]

Izberite stolpce data.table

Ena od stvari, ki mi je všeč pri data.table, je ta, da je stolpce enostavno izbrati bodisi citirano bodisi ne citirano. Nenavedeno je pogosto bolj priročno (to je navadno urejeno). Ampak citirano je uporaben, če uporabljate data.table znotraj svojih funkcij ali če želite prenesti vektor, ki ste ga ustvarili nekje drugje v svoji kodi.

Stolpce data.table lahko izberete na tipičen osnovni način R, z običajnim vektorjem citiranih imen stolpcev. Na primer:

dt1 <- mydt [, c ("LanguageWorkedWith", "LanguageDesireNextYear",

"OpenSourcer", "CurrencySymbol", "ConvertedComp",

"Hobiist")]

Če jih želite uporabiti uncitirano, ustvari seznam namesto a vektor in lahko prenesete imena, ki niso navedena.

dt1 <- mydt [, seznam (LanguageWorkedWith, LanguageDesireNextYear,

OpenSourcer, CurrencySymbol, ConvertedComp,

Ljubitelj)]

In zdaj smo prišli do našega prvega posebnega simbola. Namesto tipkanja seznam (), lahko uporabite le piko:

dt1 <- mydt [,. (LanguageWorkedWith, LanguageDesireNextYear,

OpenSourcer, CurrencySymbol, ConvertedComp,

Ljubitelj)]

To .() je bližnjica za seznam () znotraj podatkov.tabelni oklepaji.

Kaj če želite uporabiti že obstoječi vektor imen stolpcev? Vstavljanje imena vektorskega predmeta v oklepaje data.table ne bo delovalo. Če ustvarim vektor z navedenimi imeni stolpcev, takole:

mycols <- c ("LanguageWorkedWith", "LanguageDesireNextYear",

"OpenSourcer", "CurrencySymbol", "ConvertedComp", "Hobbyist")

Potem bo ta kodane delo:

dt1 <- mydt [, mikoli]

Namesto tega morate dati .. (to sta dve piki) pred imenom vektorskega predmeta:

dt1 <- mydt [, ..mycols]

Zakaj dve piki? To se mi je zdelo nekako naključno, dokler nisem prebrala razlage. Pomislite na to kot na dve piki v terminalu ukazne vrstice Unix, ki vas premakneta za en imenik navzgor. Tukaj se premikate za eno imenski prostor, od okolja znotraj podatkovnih oklepajev do globalnega okolja. (To mi resnično pomaga, da se ga spomnim!)

Štetje vrstic v tabeli

Na naslednji simbol. Za štetje po skupinah lahko uporabite data.table's .N simbol, kjer.N pomeni "število vrstic." Lahko je skupno število vrstic ali število vrstic na skupino če zbirate v razdelku »po«.

Ta izraz vrne skupno število vrstic v podatkovni tabeli:

mydt [, .N]

Naslednji primer izračuna število vrstic, zbranih z eno spremenljivko: ali ljudje v anketi kodirajo tudi kot hobi ( Hobiist spremenljivka).

mydt [, .N, konjiček]

# vrne:

Hobiist N 1: Da 71257 2: Ne 17626

Navadno ime stolpca lahko uporabite v oklepajih data.table, če obstaja samo ena spremenljivka. Če želite razvrstiti po dveh ali več spremenljivkah, uporabite . simbol. Na primer:

mydt [, .N,. (Ljubitelj, OpenSourcer)]

Če želite naročiti rezultate od najvišjega do najnižjega, lahko za prvim dodate drugi niz oklepajev. The .N simbol samodejno ustvari stolpec z imenom N (seveda ga lahko preimenujete, če želite), tako da je razvrščanje po številu vrstic lahko videti nekako takole:

mydt [, .N,. (Hobbyist, OpenSourcer)] [naročilo (Hobbyist, -N)]

Ko se učim kodo data.table, mi je v pomoč, če jo preberem korak za korakom. Tako bi to prebral kot »Za vse vrstice v mydtu (ker na mestu "I" ni nič), preštejte število vrstic, razvrstite po skupinah Hobbyist in OpenSourcer. Nato naročite najprej po hobiju in nato število vrstic padajoče. "

To je enakovredno tej kodi dplyr:

mydf%>%

count (Hobi, OpenSourcer)%>%

naročilo (hobi, -n)

Če se vam zdi običajni pristop več vrstic tidyverse bolj berljiv, deluje tudi ta koda data.table:

mydt [, .N,

. (Ljubitelj, OpenSourcer)] [

vrstni red (hobi, -N)

]

Dodajte stolpce v podatkovno tabelo

Nato bi rad dodal stolpce, da bi ugotovil, ali vsak anketiranec uporablja R, ali uporablja Python, ali oboje ali nobenega. The LanguageWorkedWith stolpec vsebuje informacije o uporabljenih jezikih in nekaj vrstic teh podatkov je videti tako:

Sharon Machlis

Vsak odgovor je en sam znakovni niz. Večina jih ima več jezikov, ločenih s podpičjem.

Kot je pogosto včasih je lažje iskati Python kot R, saj v nizu ne morete iskati samo »R« (Ruby in Rust vsebujeta tudi veliko R), kot lahko iščete »Python«. To je preprostejša koda za ustvarjanje vektorja TRUE / FALSE, ki preveri, ali je vsak niz v LanguageWorkedWith vsebuje Python:

ifelse (LanguageWorkedWith% like% "Python", TRUE, FALSE)

Če poznate SQL, boste prepoznali to sintakso »všeč mi je«. No, všeč mi je % všeč%. To je lep poenostavljen način za preverjanje ujemanja vzorcev. V dokumentaciji funkcije piše, da je namenjena uporabi v oklepajih data.table, dejansko pa jo lahko uporabite v kateri koli kodi, ne samo v data.tables. Preveril sem z ustvarjalcem data.table Mattom Dowlejem, ki je dejal, da je nasvet, da ga uporabite v oklepajih, zato, ker se tam zgodi neka dodatna optimizacija delovanja.

Nato je tukaj koda za dodajanje stolpca z imenom PythonUser v data.table:

dt1 [, PythonUser: = ifelse (LanguageWorkedWith% like% "Python", TRUE, FALSE)]

Opazite := operater. Tudi Python ima takšnega operaterja in odkar sem slišal, da se imenuje "operater mrožev", temu pravim tudi jaz. Mislim, da je to uradno "dodelitev po referenci". To je zato, ker je zgornja koda spremenila obstoječi objekt dt1 data.table z dodajanjem novega stolpca - brez ki jo je treba shraniti v novo spremenljivko.

Za iskanje R bom uporabil regularni izraz "\ bR \ b" ki pravi: "Poiščite vzorec, ki se začne z besedno mejo - \ b, nato an Rin se konča z drugo besedno mejo. (Ne morem samo iskati »R;«, ker zadnji element v vsakem nizu nima podpičja.)

To dt1 doda stolpec RUser:

dt1 [, RUser: = ifelse (LanguageWorkedWith% like% "\ bR \ b", TRUE, FALSE)]

Če želite dodati oba stolpca hkrati z := bi morali tega operaterja mrožev spremeniti v funkcijo tako, da jo naštejete nazaj, takole:

dt1 [, `:=`(

PythonUser = ifelse (LanguageWorkedWith% like% "Python", TRUE, FALSE),

RUser = ifelse (LanguageWorkedWith% like% "\ bR \ b", TRUE, FALSE)

)]

Uporabnejši operaterji data.table

Obstaja še nekaj drugih operaterjev podatkovnih tabel, ki jih je vredno vedeti. The% med% operator ima to sintakso:

moj vektor% med% c (spodnja_vrednost, zgornja_vrednost)

Torej, če želim filtrirati vse odgovore, pri katerih je bilo odškodnina plačana v ameriških dolarjih med 50.000 in 100.000, ta koda deluje:

comp_50_100k <- dt1 [CurrencySymbol == "USD" &

ConvertedComp% med% c (50000, 100000)]

Druga vrstica zgoraj je pogoj med. Upoštevajte, da % med% med preverjanjem vključuje spodnjo in zgornjo vrednost.

Drug uporaben operator je % brada%. Deluje kot osnova R-jev % v% vendar je optimiziran za hitrost in je za samo vektorji znakov. Torej, če želim filtrirati za vse vrstice, v katerih je bil stolpec OpenSourcer bodisi »Nikoli« ali »Manj kot enkrat na leto«, ta koda deluje:

rareos <- dt1 [OpenSourcer% chin% c ("Nikoli", "Manj kot enkrat na leto")]

To je precej podobno kot osnova R, le da mora baza R navesti ime podatkovnega okvira v oklepaju in zahteva tudi vejico po izrazu filtra:

rareos_df <- df1 [df1 $ OpenSourcer% v% c ("Nikoli", "Manj kot enkrat na leto"),]

Nova funkcija fcase ()

Za to končno predstavitev bom začel z ustvarjanjem nove podatkovne tabele s samo ljudmi, ki so prijavili odškodnino v ameriških dolarjih:

usd <- dt1 [CurrencySymbol == "USD" &! is.na (ConvertedComp)]

Nato ustvarim nov stolpec z imenom Jezik ali nekdo uporablja samo R, samo Python, oboje ali nobenega. In uporabil bom novo fcase () funkcijo. V času objave tega članka fcase () je bil na voljo samo v razvojni različici data.table. Če že imate nameščen data.table, ga lahko posodobite na najnovejšo različico za razvijalce s tem ukazom:

data.table :: update.dev.pkg ()

Funkcija fcase () je podobna funkciji SQL PRIMER KDAJ izjava in dplyr's case_when () funkcijo. Osnovna sintaksa jefcase (pogoj1, "vrednost1", stanje2, "vrednost2") in tako naprej. Z lahko dodate privzeto vrednost za »vse ostalo« privzeto = vrednost.

Tu je koda za ustvarjanje novega stolpca Jezik:

usd [, jezik: = fcase (

RUser &! PythonUser, "R",

PythonUser &! RUser, "Python",

PythonUser & RUser, "Oba",

! PythonUser &! RUser, "Niti"

)]

Vsak pogoj postavim v ločeno vrstico, ker ga lažje berem, vendar vam ni treba.

Pozor: Če uporabljate RStudio, se struktura data.table ne samodejno posodobi v zgornjem desnem podoknu RStudio, potem ko ustvarite nov stolpec z operaterjem mrožev. Če želite videti spremembe števila stolpcev, morate ročno klikniti ikono za osvežitev.

V tem članku je nekaj drugih simbolov, ki jih ne bom obravnaval. Z zagonom jih najdete v datoteki s pomočjo za posebne tabele »data.table« pomoč ("posebni simboli"). Eden najbolj uporabnih, .SD, že ima svoj članek in videoposnetek Naredite več z R, "Kako uporabiti .SD v paketu R data.table."

Če želite več nasvetov R, pojdite na stran »Naredite več z R« na seznamu predvajanja YouTube ali pa si oglejte »Naredi več z R«.

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