R podaci.tablični simboli i operateri koje biste trebali znati

R data.table kôd postaje učinkovitiji - i elegantan - kada iskoristite njegove posebne simbole i funkcije. Imajući to na umu, razmotrit ćemo neke posebne načine podskupa, brojanja i stvaranja novih stupaca.

Za ovu demonstraciju upotrijebit ću podatke iz ankete programera Stack Overflowa s oko 90 000 odgovora. Ako želite nastaviti dalje, podatke možete preuzeti iz Stack Overflowa.

Ako paket data.table nije instaliran na vašem sustavu, instalirajte ga iz CRAN-a i zatim ga učitajte kao i obično library(data.table). Za početak ćete možda htjeti pročitati samo prvih nekoliko redaka skupa podataka kako biste olakšali ispitivanje strukture podataka. To možete učiniti s funkcijom data.table fread()i nrowsargumentom. Čitat ću u 10 redaka:

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

Kao što ćete vidjeti, treba ispitati 85 stupaca. (Ako želite znati što znače svi stupci, u preuzimanju su datoteke s shemom podataka i PDF originalne ankete.) 

Za čitanje svih podataka koristit ću:

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

Dalje ću stvoriti novi data.table sa samo nekoliko stupaca kako bih olakšao rad i pregled rezultata. Podsjetnik da data.table koristi ovu osnovnu sintaksu: 

mydt [i, j, autor]

Uvod u paketu data.table kaže da se ovo čita kao "uzmi dt, podskupi ili promijeni redoslijed pomoću i, izračunaj j, grupirano po." Imajte na umu da su i i j slični redoslijedu zagrada baze R: prvo redovi, drugi stupci. Dakle, ja sam za operacije koje biste radili na redovima (odabir redaka na temelju brojeva ili uvjeta); j je ono što biste radili sa stupcima (odaberite stupce ili stvorite nove stupce iz izračuna). Međutim, također imajte na umu da unutar zagrada data.table možete učiniti puno više od osnovnog okvira podataka R. A odjeljak "po" nov je za data.table.

Budući da odabirem stupce, taj kod ide na mjesto "j", što znači da zagradama prvo treba zarez da mjesto "i" ostane prazno:

mydt [, j]

Odaberite stupce tablice data.table

Jedna od stvari koje mi se sviđaju kod data.table je da je lako odabrati stupce koji su citirani ili ne citirani . Necitirano je često prikladnije (to je obično put u suprotnom smjeru). Ali citirano je korisno ako koristite data.table unutar vlastitih funkcija ili ako želite predati vektor koji ste stvorili negdje drugdje u svom kodu.

Možete odabrati data.table stupce tipičnim osnovnim R načinom, s konvencionalnim vektorom citiranih imena stupaca. Na primjer: 

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

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

"Hobist")]

Ako ih želite koristiti nenavedene , stvorite popis umjesto vektora i možete dodati imena bez citata. 

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Hobist)]

I sada smo došli do našeg prvog posebnog simbola. Umjesto da upišete list(), možete samo upotrijebiti točku:

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Hobist)]

To .()je prečac za list()unutarnje podatke zagrada tablice.

Što ako želite koristiti već postojeći vektor imena stupaca? Stavljanje imena vektorskog objekta unutar zagrada data.table neće raditi. Ako stvorim vektor s navedenim imenima stupaca, ovako: 

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

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

Zatim taj kod će  ne raditi: 

dt1 <- mydt [, mycols]

Umjesto toga, .. ispred imena vektorskog objekta morate staviti (to su dvije točke):

dt1 <- mydt [, ..mycols]

Zašto dvije točke? To mi se činilo nekako slučajno dok nisam pročitao objašnjenje. Zamislite to kao dvije točke u Unixovom terminalu naredbenog retka koje vas pomiču za jedan direktorij gore. Ovdje se pomičete za jedan prostor imena , od okruženja unutar zagrada data.table do globalnog okruženja. (To mi stvarno pomaže da se toga sjetim!)

Broji podatke.tablica redaka

Na sljedeći simbol. Za brojanje po skupinama možete upotrijebiti .Nsimbol data.table , gdje  .Noznačava "broj redaka". To može biti ukupan broj redaka ili broj redaka po grupi ako agregirate u odjeljku "po". 

Ovaj izraz vraća ukupan broj redaka u data.table: 

mydt [, .N]

Sljedeći primjer izračunava broj redaka grupiranih prema jednoj varijabli: da li ljudi u anketi kodiraju i kao hobi ( Hobbyistvarijabla).

mydt [, .N, hobist]

# vraća:

Hobist N 1: Da 71257 2: Ne 17626

Jednostavno ime stupca možete koristiti u zagradama data.table ako postoji samo jedna varijabla. Ako želite grupirati po dvije ili više varijabli, upotrijebite .simbol. Na primjer:

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

Da biste poredali rezultate od najvišeg do najnižeg, možete dodati drugi set zagrada nakon prvog. .NSimbol automatski generira kolumnu pod nazivom N (naravno da ga možete preimenovati, ako želite), pa naručivanja od broja redaka može izgledati otprilike ovako:

mydt [, .N,. (Hobist, OpenSourcer)] [narudžba (hobist, -N)]

Dok učim kod data.table, korisno mi je čitati ga korak po korak. Dakle, ovo bih pročitao kao "Za sve retke u mydtu (budući da na mjestu" I "nema ništa), izbrojite broj redaka, grupirajući prema hobistima i OpenSourceru. Zatim prvo naručite prema hobistima, a zatim prema broju redova. " 

To je ekvivalentno ovom dplyr kodu:

mydf%>%

count (hobi, OpenSourcer)%>%

narudžba (hobi, -n)

Ako smatrate da je konvencionalni višeredni pristup tidyverse čitljiviji, ovaj kod data.table također radi:

mydt [, .N,

(Hobi, OpenSourcer)] [

narudžba (hobi, -N)

]

Dodajte stupce u tablicu data.table

Dalje, želio bih dodati stupce da vidim koristi li svaki ispitanik R, koristi li Python, koriste li oboje ili ne koriste nijedan. LanguageWorkedWithStupac ima informacije o jezicima koji se koristi, a nekoliko redaka da se podaci izgledaju ovako:

Sharon Machlis

Svaki je odgovor jedan niz znakova. Većina ima više jezika odvojenih zarezom.

Kao što je često slučaj, lakše je tražiti Python nego R, jer ne možete samo tražiti "R" u nizu (Ruby i Rust sadrže i veliko R) na način na koji možete tražiti "Python". Ovo je jednostavniji kod za stvaranje TRUE / FALSE vektora koji provjerava sadrži li svaki niz u LanguageWorkedWithPythonu:

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

Ako poznajete SQL, prepoznat ćete tu sintaksu "sviđa mi se". Pa, sviđa mi se. %like%. To je lijep pojednostavljeni način provjere podudaranja uzoraka. Dokumentacija o funkciji kaže da je namijenjena upotrebi u zagradama data.table, ali zapravo je možete koristiti u bilo kojem kodu, ne samo u data.tables. Provjerio sam s kreatorom data.tablea Matt Dowleom, koji je rekao da je savjet da se koristi u zagradama zato što se tamo događa neka dodatna optimizacija performansi.

Dalje, evo koda za dodavanje stupca nazvanog PythonUser u data.table:

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

Primijetite :=operatora. I Python ima takvog operatora, i otkako sam čuo da se zove "operater morža", tako ga i zovem. Mislim da je to službeno "zadatak referencom". To je zato što je gornji kod promijenio postojeći objekt dt1 data.table dodavanjem novog stupca - bez potrebe za spremanjem u novu varijablu .

Za traženje R upotrijebit ću regularni izraz "\\bR\\b"koji kaže: „Pronađite obrazac koji započinje granicom riječi - the \\b, zatim an R, a zatim završava s drugom granicom riječi. (Ne mogu samo potražiti "R;", jer zadnja stavka u svakom nizu nema zarez.) 

To dodaje stupac RUser u dt1:

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

Ako biste željeli dodati oba stupca odjednom :=, morali biste pretvoriti tog operatora morža u funkciju povratnim citiranjem, ovako:

dt1 [, `: =` (

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

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

)]]

Korisniji podaci.tablični operatori

Postoji nekoliko drugih podataka.taperatori koje vrijedi znati. %between% Operater ima ovu sintaksu:

moj vektor% između% c (donja_vrijednost, gornja_vrijednost)

Dakle, ako želim filtrirati sve odgovore u kojima je naknada plaćena u američkim dolarima između 50.000 i 100.000, ovaj kod funkcionira:

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

ConvertedComp% između% c (50000, 100000)]

Drugi redak gore je uvjet između. Imajte na umu da %between%operator uključuje i donju i gornju vrijednost kada provjerava.

Još jedan koristan operator je %chin%. Radi kao osnovni R, %in%ali optimiziran je za brzinu i samo je za vektore znakova . Dakle, ako želim filtrirati sve retke u kojima je OpenSourcer stupac bio „Nikad“ ili „Manje od jednom godišnje“, ovaj kod radi:

rareos <- dt1 [OpenSourcer% brada% c ("Nikad", "Manje od jednom godišnje")]

Ovo je prilično slično osnovi R, osim što baza R mora navesti ime okvira podataka unutar zagrade, a također zahtijeva zarez nakon izraza filtra:

rareos_df <- df1 [df1 $ OpenSourcer% u% c ("Nikad", "Manje od jednom godišnje"),]

Nova funkcija fcase ()

Za ovaj posljednji demo započet ću s izradom nove data.table sa samo ljudima koji su prijavili naknadu u američkim dolarima:

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

Dalje, stvorit ću novi stupac koji se zove Languagekoristi li netko samo R, samo Python, oboje ili niti jedan. I koristit ću novu fcase()funkciju. U vrijeme objavljivanja ovog članka bio fcase()je dostupan samo u razvojnoj verziji data.tablea. Ako već imate instaliran data.table, ovom naredbom možete ažurirati na najnoviju verziju za razvoj: 

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

Funkcija fcase () slična je SQL CASE WHENizjavi i funkciji dplyr case_when(). Osnovna sintaksa je  fcase(condition1, "value1", condition2, "value2")i tako dalje. Zadana vrijednost za "sve ostalo" može se dodati s default = value.

Evo koda za stvaranje novog stupca Jezik:

usd [, jezik: = fcase (

RUser &! PythonUser, "R",

PythonUser &! RUser, "Python",

PythonUser i RUser, "Oba",

! PythonUser &! RUser, "Ni jedno ni drugo"

)]]

Svaki uvjet stavljam u zaseban redak jer mi je lakše čitati, ali ne moraš.

Oprez: Ako koristite RStudio, struktura data.table ne ažurira se automatski u gornjem desnom oknu RStudio nakon što stvorite novi stupac s operatorom morža. Morate ručno kliknuti ikonu osvježavanja da biste vidjeli promjene u broju stupaca.

Postoji nekoliko drugih simbola koje neću pokriti u ovom članku. Popis njih možete pronaći u datoteci pomoći "data.table" pomoću "posebnih simbola" pokretanjem help("special-symbols"). Jedan od najkorisnijih, .SD, već ima vlastiti članak i videozapis „Učini više s R“, „Kako koristiti .SD u paketu R data.table“

Da biste saznali više R-savjeta, posjetite stranicu "Učinite više s R" na YouTubeu ili pogledajte YouTube "Popis za reprodukciju" Učinite više s R ".