Programovanie

R dáta. Symboly tabuľky a operátory, ktoré by ste mali poznať

Kód R data.table sa stáva efektívnejším - a elegantnejším - keď využijete výhody jeho špeciálnych symbolov a funkcií. V tejto súvislosti sa pozrieme na niektoré špeciálne spôsoby podmnožiny, počítania a vytvárania nových stĺpcov.

V tejto ukážke použijem údaje z prieskumu vývojárov Stack Overflow 2019 s asi 90 000 odpoveďami. Ak chcete pokračovať, môžete si stiahnuť údaje zo Stack Overflow.

Ak vo vašom systéme nie je nainštalovaný balík data.table, nainštalujte ho z CRANu a potom ho načítajte ako obvykle do knižnica (data.table). Ak chcete začať, možno budete chcieť čítať iba prvých pár riadkov množiny údajov, aby ste mohli jednoduchšie preskúmať štruktúru údajov. Môžete to urobiť pomocou nástroja data.table fread () funkcie a nrow argument. Čítam v 10 riadkoch:

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

Ako uvidíte, je potrebné preskúmať 85 stĺpcov. (Ak chcete vedieť, čo znamenajú všetky stĺpce, v priečinku na stiahnutie sú súbory s údajovou schémou a PDF pôvodného prieskumu.)

Na načítanie všetkých údajov použijem:

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

Ďalej vytvorím novú tabuľku data.tabuľku s niekoľkými stĺpcami, ktorá uľahčí prácu s výsledkami a ich výsledky. Pripomenutie, že tabuľka data.table používa túto základnú syntax:

mydt [i, j, autor]

V úvode balíka data.table sa píše, že toto sa má čítať ako „vezmite dt, podmnožinu alebo usporiadajte riadky pomocou i, vypočítajte j, zoskupené podľa“. Nezabúdajte, že i a j sú podobné usporiadaniu zátvoriek základného R: prvé riadky, druhé stĺpce. Takže ja je pre operácie, ktoré by ste robili s riadkami (výber riadkov na základe počtu riadkov alebo podmienok); j je to, čo by ste robili so stĺpcami (vyberte stĺpce alebo vytvorte nové stĺpce z výpočtov). Nezabudnite však tiež, že v zátvorkách data.table môžete urobiť oveľa viac ako v základnom dátovom rámci R. A sekcia „podľa“ je pre data.table nová.

Odkedy som výber stĺpce, tento kód sa nachádza na mieste „j“, čo znamená, že v zátvorkách je najskôr potrebná čiarka, aby bolo miesto „i“ prázdne:

mydt [, j]

Vyberte stĺpce tabuľky údajov

Jedna z vecí, ktorá sa mi na data.table páči, je, že je ľahké vyberať stĺpce citované alebo nekótované. Bez uvedenia je často pohodlnejšie (to je zvyčajne uprataný spôsob). ale citované je užitočné, ak vo svojich vlastných funkciách používate data.table alebo ak chcete odovzdať vektor, ktorý ste vytvorili niekde inde v kóde.

Môžete si vybrať stĺpce data.table typickým základným spôsobom R s konvenčným vektorom ponúkaných názvov stĺpcov. Napríklad:

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

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

„Hobbyist“)]

Ak ich chcete použiť uncitované, vytvoriť zoznam namiesto a vektor a môžete vložiť neuvádzané mená.

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Záujemca)]

A teraz prichádzame k nášmu prvému špeciálnemu symbolu. Namiesto vypisovania zoznam (), stačí použiť bodku:

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Záujemca)]

To .() je skratka pre zoznam () interné údaje.tabuľkové zátvorky.

Čo ak chcete použiť už existujúci vektor názvov stĺpcov? Vkladanie názvu vektorového objektu do zátvoriek data.table nebude fungovať. Ak vytvorím vektor s citovanými názvami stĺpcov, takto:

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

„OpenSourcer“, „CurrencySymbol“, „ConvertedComp“, „Hobbyist“)

Potom bude tento kódnie práca:

dt1 <- mydt [, mycols]

Namiesto toho musíte dať .. (to sú dve bodky) pred názvom vektorového objektu:

dt1 <- mydt [, ..mycols]

Prečo dve bodky? To sa mi zdalo akési náhodné, až kým som si neprečítal vysvetlenie. Predstavte si to ako dve bodky v termináli príkazového riadku Unixu, ktoré vás presunú o jeden adresár vyššie. Tu sa posúvaš o jednu vyššie menný priestor, od prostredia v zátvorkách data.table až po globálne prostredie. (To mi skutočne pomáha pamätať si!)

Spočítajte riadky tabuľky data.table

Na ďalší symbol. Ak chcete počítať podľa skupiny, môžete použiť údajovú tabuľku .N symbol, kde.N znamená „počet riadkov“. Môže to byť celkový počet riadkov alebo počet riadkov na skupinu ak agregujete v sekcii „podľa“.

Tento výraz vráti celkový počet riadkov v data.table:

mydt [, .N]

Nasledujúci príklad počíta počet riadkov zoskupených podľa jednej premennej: či ľudia v prieskume kódujú aj ako hobby (znak Fanda premenná).

mydt [, .N, fanda]

# vráti:

Fanda N 1: Áno 71257 2: Nie 17626

Ak existuje iba jedna premenná, môžete v zátvorkách data.table použiť obyčajný názov stĺpca. Ak chcete zoskupiť podľa dvoch alebo viacerých premenných, použite . symbol. Napríklad:

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

Ak chcete zoradiť výsledky od najvyššej po najnižšiu, môžete za druhú pridať druhú skupinu zátvoriek. The .N symbol automaticky generuje stĺpec s názvom N (samozrejme ho môžete premenovať, ak chcete), takže zoradenie podľa počtu riadkov môže vyzerať napríklad takto:

mydt [, .N,. (Hobbyist, OpenSourcer)] [objednávka (Hobbyist, -N)]

Keď sa dozvedám kód data.table, považujem za užitočné si ho prečítať krok za krokom. Čítal by som to ako „Pre všetko riadky v mydt (pretože na mieste „I“ nie je nič), spočítať počet riadkov, zoskupené podľa Hobbyist a OpenSourcer. Potom si objednajte najskôr nadšenca a potom počet riadkov zostupne. “

To sa rovná tomuto kódu dplyr:

mydf%>%

počet (fanda, OpenSourcer)%>%

objednávka (fanda, -n)

Ak sa vám zdá konvenčný viacriadkový prístup tidyverse čitateľnejší, funguje aj tento kód data.table:

mydt [, .N,

. (Hobbyist, OpenSourcer)] [

objednávka (fanda, -N)

]

Pridajte stĺpce do tabuľky údajov

Ďalej by som rád pridal stĺpce, aby som zistil, či každý respondent používa R, či používa Python, či používa oba, alebo či nepoužíva ani jeden. The LanguageWorkedWith stĺpec obsahuje informácie o použitých jazykoch a niekoľko riadkov týchto údajov vyzerá takto:

Sharon Machlis

Každá odpoveď má charakter jedného reťazca znakov. Väčšina z nich má viac jazykov oddelených bodkočiarkou.

Ako to často býva, je jednoduchšie hľadať Python ako R, pretože v reťazci nemôžete hľadať iba „R“ (Ruby a Rust obsahujú aj veľké R), ako môžete vyhľadávať „Python“. Toto je jednoduchší kód na vytvorenie vektora TRUE / FALSE, ktorý kontroluje, či je každý reťazec v LanguageWorkedWith obsahuje Python:

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

Ak poznáte SQL, poznáte túto „lajkovú“ syntax. Ja, no, rád %Páči sa mi to%. Je to pekný efektívny spôsob kontroly zhody vzorov. Dokumentácia funkcií hovorí, že je určená na použitie v zátvorkách data.table, ale v skutočnosti ju môžete použiť v ktoromkoľvek zo svojich kódov, nielen s data.tables. Skontroloval som to u tvorcu data.table Matta Dowleho, ktorý uviedol, že rada použiť ho v zátvorkách je preto, že sa tam deje nejaká ďalšia optimalizácia výkonu.

Ďalej uvádzame kód na pridanie stĺpca s názvom PythonUser do tabuľky data.table:

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

Všimnite si := operátor. Aj Python má takého operátora a odkedy som počul, že sa volá „operátor mrožov“, tak mu hovorím. Myslím si, že je to oficiálne „priradenie pomocou referencie“. Je to preto, že vyššie uvedený kód zmenil existujúci objekt dt1 data.table pridaním nového stĺpca - bez je potrebné uložiť ju do novej premennej.

Na hľadanie R použijem regulárny výraz „\ bR \ b“ ktorý hovorí: „Nájdite vzor, ​​ktorý začína na hranici slova - \ b, potom R, a potom končite ďalšou hranicou slova. (Nemôžem hľadať iba „R;“, pretože posledná položka v každom reťazci nemá bodkočiarku.)

Týmto sa do dt1 pridá stĺpec RUser:

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

Ak ste chceli pridať oba stĺpce naraz pomocou := budete musieť zmeniť tohto operátora mrože na funkciu spätným citovaním, napríklad takto:

dt1 [, `:=`(

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

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

)]

Užitočnejšie operátory údajov. Tabuľky

Existuje niekoľko ďalších operátorov údajových tabuliek, ktoré stojí za to vedieť. The% medzi% operátor má túto syntax:

myvector% medzi% c (lower_value, upper_value)

Takže ak chcem filtrovať všetky odpovede, kde kompenzácia bola medzi 50 000 a 100 000 vyplatenými v amerických dolároch, tento kód funguje:

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

ConvertedComp% medzi% c (50 000, 10 000)]

Druhý riadok vyššie je medzi podmienkou. Všimnite si, že % medzi% operátor pri kontrole zahrnie dolnú aj hornú hodnotu.

Ďalším užitočným operátorom je %Brada%. Funguje to ako základňa R. % v% ale je optimalizovaný pre rýchlosť a je pre iba vektory znakov. Takže ak chcem filtrovať všetky riadky, kde stĺpec OpenSourcer bol „Nikdy“ alebo „Menej ako raz za rok“, tento kód funguje:

rareos <- dt1 [OpenSourcer% chin% c ("Nikdy", "Menej ako raz za rok")]

Toto je dosť podobné základu R, s tým rozdielom, že základňa R musí určiť názov dátového rámca v zátvorke a po výraze filtra vyžaduje aj čiarku:

rareos_df <- df1 [df1 $ OpenSourcer% v% c ("Nikdy", "Menej ako raz za rok"),]

Nová funkcia fcase ()

Pri tejto poslednej ukážke začnem vytvorením novej tabuľky údajov. Iba s ľuďmi, ktorí nahlásili kompenzáciu v amerických dolároch:

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

Ďalej vytvorím nový stĺpec s názvom Jazyk pre to, či niekto používa iba R, iba Python, oba alebo ani jeden. A použijem nové fcase () funkcia. V čase uverejnenia tohto článku fcase () bol k dispozícii iba vo vývojovej verzii dátovej tabuľky. Ak už máte data.table nainštalovaný, môžete pomocou tohto príkazu aktualizovať na najnovšiu verziu dev:

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

Funkcia fcase () je podobná funkcii SQL PRÍPAD KEDY vyhlásenie a dplyr’s case_when () funkcia. Základná syntax jefcase (podmienka1, "hodnota1", podmienka2, "hodnota2") a tak ďalej. Je možné pridať predvolenú hodnotu pre „všetko ostatné“ default = hodnota.

Tu je kód na vytvorenie nového stĺpca Jazyk:

usd [, jazyk: = fcase (

RUser &! PythonUser, "R",

PythonUser &! RUser, "Python",

PythonUser & RUser, "Both",

! PythonUser &! RUser, „Ani jeden“

)]

Každú podmienku som dal do samostatného riadku, pretože sa mi ľahšie číta, ale nemusíte.

Upozornenie: Ak používate program RStudio, štruktúra tabuľky data.table sa po vytvorení nového stĺpca pomocou operátora mrož automaticky v paneli RStudio vpravo hore neaktualizuje. Ak chcete zobraziť zmeny v počte stĺpcov, musíte kliknúť manuálne na ikonu obnovenia.

Existuje niekoľko ďalších symbolov, ktorým sa v tomto článku nebudem venovať. Ich zoznam nájdete v pomocnom súbore dátových tabuliek „špeciálne symboly“ spustením pomocník („špeciálne symboly“). Jeden z najužitočnejších, .SD, už má vlastný článok a video s názvom Do More With R „Ako používať .SD v balíku R data.table.“

Ďalšie tipy R nájdete na stránke „Do More With R“ na stránke YouTube alebo v zozname videí „Do More With R“.

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