Programování

R data. Symboly tabulky a operátory, které byste měli znát

Kód R data.table se stane efektivnějším - a elegantnějším - když využijete jeho speciální symboly a funkce. S ohledem na to se podíváme na několik zvláštních způsobů podmnožiny, počítání a vytváření nových sloupců.

U této ukázky použiji data z průzkumu vývojářů Stack Overflow 2019 s asi 90 000 odpověďmi. Pokud chcete pokračovat, můžete si stáhnout data ze Stack Overflow.

Pokud ve vašem systému není nainstalován balíček data.table, nainstalujte jej z aplikace CRAN a poté jej načtěte obvyklým způsobem knihovna (data.table). Chcete-li začít, možná budete chtít číst pouze v prvních několika řádcích datové sady, abyste usnadnili zkoumání datové struktury. Můžete to udělat pomocí data.table fread () funkce a nrow argument. Přečtu v 10 řádcích:

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

Jak uvidíte, je třeba prozkoumat 85 sloupců. (Pokud chcete vědět, co znamenají všechny sloupce, ve stahování jsou soubory s datovým schématem a PDF původního průzkumu.)

K načtení všech údajů použiji:

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

Dále vytvořím novou datovou tabulku s několika sloupci, která usnadní práci s výsledky. Připomenutí, že data.table používá tuto základní syntaxi:

mydt [i, j, podle]

Úvod balíčku data.table říká, že si to přečtěte jako „vezměte dt, podmnožinu nebo změňte pořadí řádků pomocí i, vypočítat j, seskupit podle.“ Pamatujte, že i a j jsou podobné uspořádání závorek základny R: první řádky, druhé sloupce. Takže i je pro operace, které byste prováděli s řádky (výběr řádků na základě čísel řádků nebo podmínek); j je to, co byste dělali se sloupci (vyberte sloupce nebo vytvořte nové sloupce z výpočtů). Všimněte si však také, že uvnitř závorek data.table můžete udělat mnohem více než základní datový rámec R. Sekce „podle“ je pro data.table nová.

Protože jsem výběr sloupce, tento kód se nachází na místě „j“, což znamená, že v závorkách je nejprve potřeba čárka, aby bylo místo „i“ prázdné:

mydt [, j]

Vyberte sloupce tabulky dat

Jedna z věcí, která se mi na data.table líbí, je, že je snadné vybrat sloupce buď citováno, nebo nekótováno. Necitováno je často pohodlnější (to je obvykle úhledný způsob). Ale citováno je užitečné, pokud používáte data.table ve svých vlastních funkcích nebo pokud chcete předat vektor, který jste vytvořili někde jinde ve svém kódu.

Můžete vybrat sloupce data.table typickým základním způsobem typu R s konvenčním vektorem s názvy citovaných sloupců. Například:

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

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

„Fanda“)]

Pokud je chcete použít uncitováno, vytvořit seznam místo a vektor a můžete předat nekotované názvy.

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Fanda)]

A nyní se dostáváme k našemu prvnímu speciálnímu symbolu. Místo psaní seznam(), stačí použít tečku:

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Fanda)]

Že .() je zkratka pro seznam() vnitřní data.tabulka závorky.

Co když chcete použít již existující vektor názvů sloupců? Vkládání názvu vektorového objektu do datových závorek tabulky nebude fungovat. Pokud vytvořím vektor s uvozenými názvy sloupců, tak jako:

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

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

Pak tento kód budene práce:

dt1 <- mydt [, mycols]

Místo toho musíte dát .. (to jsou dvě tečky) před názvem vektorového objektu:

dt1 <- mydt [, ..mycols]

Proč dvě tečky? Zdálo se mi to trochu náhodné, dokud jsem si nepřečetl vysvětlení. Představte si to jako dvě tečky v terminálu příkazového řádku Unix, které vás posunou o jeden adresář výše. Tady se pohybujete o jednu nahoru jmenný prostor, od prostředí uvnitř datových tabulkových závorek až po globální prostředí. (To mi opravdu pomáhá pamatovat si!)

Počítat řádky tabulky data

Na další symbol. Chcete-li počítat podle skupiny, můžete použít data.table .N symbol, kde.N znamená „počet řádků“. Může to být celkový počet řádků nebo počet řádků na skupinu pokud agregujete v sekci „podle“.

Tento výraz vrací celkový počet řádků v datové tabulce.

mydt [, .N]

Následující příklad vypočítá počet řádků seskupených podle jedné proměnné: zda lidé v průzkumu také kódují jako hobby ( Fanda proměnná).

mydt [, .N, fanda]

# vrací:

Fanda N 1: Ano 71257 2: Ne 17626

Pokud existuje pouze jedna proměnná, můžete použít jednoduchý název sloupce v hranatých závorkách data.table. Pokud chcete seskupit podle dvou nebo více proměnných, použijte . symbol. Například:

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

Chcete-li uspořádat výsledky od nejvyšší po nejnižší, můžete za první přidat druhou sadu závorek. The .N symbol automaticky generuje sloupec s názvem N (samozřejmě ho můžete přejmenovat, pokud chcete), takže objednávání podle počtu řádků může vypadat nějak takto:

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

Jak se učím kód data.table, považuji za užitečné číst ho krok za krokem. Četl bych to jako „Pro Všechno řádky v mydt (protože na místě „I“ nic není), spočítat počet řádků, seskupení podle Hobbyist a OpenSourcer. Pak si objednejte nejdříve podle fandy a poté počet řádků sestupně. “

To odpovídá tomuto kódu dplyr:

mydf%>%

počet (fanda, OpenSourcer)%>%

objednávka (fanda, -n)

Pokud zjistíte, že konvenční víceřádkový přístup tidyverse je čitelnější, funguje tento kód data.table také:

mydt [, .N,

. (Fanda, OpenSourcer)] [

objednávka (fanda, -N)

]

Přidejte sloupce do tabulky dat

Dále bych chtěl přidat sloupce, abych zjistil, zda každý respondent používá R, jestli používá Python, jestli používá oba, nebo jestli nepoužívá ani jeden. The LanguageWorkedWith sloupec obsahuje informace o použitých jazycích a několik řádků těchto dat vypadá takto:

Sharon Machlis

Každá odpověď je jednoznakový řetězec. Většina z nich má více jazyků oddělených středníkem.

Jak se často stává, je jednodušší hledat Python než R, protože v řetězci nemůžete hledat pouze „R“ (Ruby a Rust také obsahují velké R), jak můžete hledat „Python“. Jedná se o jednodušší kód pro vytvoření TRUE / FALSE vektoru, který kontroluje, zda je každý řetězec v LanguageWorkedWith obsahuje Python:

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

Pokud znáte SQL, poznáte tuto „lajkovou“ syntaxi. Já, no, rád %jako%. Je to pěkný efektivní způsob kontroly shody vzorů. Dokumentace funkce říká, že má být použita uvnitř závorek data.table, ale ve skutečnosti ji můžete použít v libovolném kódu, nejen v datech. Zkontroloval jsem to u tvůrce data.table Matta Dowleho, který řekl, že jeho použití uvnitř závorek je proto, že tam dochází k nějaké další optimalizaci výkonu.

Dále je zde kód pro přidání sloupce s názvem PythonUser do datové tabulky:

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

Všimněte si := operátor. Python má také takového operátora a od té doby, co jsem slyšel, že se mu říká „operátor mrože“, tak tomu říkám. Myslím, že je to oficiálně „přiřazení podle odkazu“. Je to proto, že výše uvedený kód změnil stávající objekt dt1 data.table přidáním nového sloupce - bez potřebují uložit do nové proměnné.

K vyhledávání R použiji regulární výraz „\ bR \ b“ který říká: „Najděte vzor, ​​který začíná hranicí slova - \ b, pak Ra poté končí další hranicí slova. (Nemohu jen hledat „R;“, protože poslední položka v každém řetězci nemá středník.)

Tím se do dt1 přidá sloupec RUser:

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

Pokud jste chtěli přidat oba sloupce najednou pomocí := budete muset tento operátor mrože proměnit ve funkci zpětným citováním, například takto:

dt1 [, `:=`(

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

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

)]

Více užitečných operátorů datových tabulek

Existuje několik dalších operátorů datových tabulek, které stojí za to vědět. The%mezi% operátor má tuto syntaxi:

myvector% mezi% c (lower_value, upper_value)

Takže pokud chci filtrovat pro všechny odpovědi, kde kompenzace byla mezi 50 000 a 100 000 vyplácenými v amerických dolarech, tento kód funguje:

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

ConvertedComp% mezi% c (50000, 100000)]

Druhý řádek výše je mezi podmínkou. Všimněte si, že %mezi% operátor při kontrole zahrnuje dolní i horní hodnoty.

Dalším užitečným operátorem je %brada%. Funguje to jako základna R. %v% ale je optimalizován pro rychlost a je pro pouze vektory znaků. Pokud tedy chci filtrovat všechny řádky, kde byl sloupec OpenSourcer „Nikdy“ nebo „Méně než jednou za rok“, tento kód funguje:

rareos <- dt1 [OpenSourcer% chin% c ("Nikdy", "Méně než jednou za rok")]

To je docela podobné základu R, kromě toho, že základna R musí zadat název datového rámce uvnitř závorky a po výrazu filtru také vyžaduje čárku:

rareos_df <- df1 [df1 $ OpenSourcer% v% c ("Nikdy", "Méně než jednou za rok"),]

Nová funkce fcase ()

U této závěrečné ukázky začnu vytvořením nové datové tabulky s pouhými lidmi, kteří nahlásili kompenzaci v amerických dolarech:

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

Dále vytvořím nový sloupec s názvem Jazyk pro to, zda někdo používá pouze R, jen Python, oba, nebo žádný. A já použiji nové fcase () funkce. V době, kdy byl tento článek publikován, fcase () byl k dispozici pouze ve vývojové verzi dat.tabulky. Pokud již máte data.table nainstalovanou, můžete provést aktualizaci na nejnovější verzi dev pomocí tohoto příkazu:

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

Funkce fcase () je podobná funkci SQL PŘÍPAD KDYKOLI prohlášení a dplyr case_when () funkce. Základní syntaxe jefcase (podmínka1, "hodnota1", podmínka2, "hodnota2") a tak dále. Lze přidat výchozí hodnotu pro „vše ostatní“ default = hodnota.

Zde je kód k vytvoření nového sloupce Jazyk:

usd [, jazyk: = fcase (

RUser &! PythonUser, "R",

PythonUser &! RUser, "Python",

PythonUser & RUser, "Both",

! PythonUser &! RUser, "Ani"

)]

Každou podmínku jsem dal na samostatný řádek, protože se mi čte snadněji, ale nemusíte.

Upozornění: Pokud používáte RStudio, struktura dat.tabulky se v pravém horním podokně RStudio automaticky neaktualizuje po vytvoření nového sloupce pomocí operátoru mrož. Chcete-li zobrazit změny v počtu sloupců, musíte kliknout ručně na ikonu obnovení.

V tomto článku nebudu popisovat několik dalších symbolů. Jejich seznam najdete v souboru nápovědy datových tabulek „speciální symboly“ spuštěním help ("speciální symboly"). Jeden z nejužitečnějších, .SD, již má svůj vlastní článek a video Do More With R. „Jak používat .SD v balíčku R data.table.“

Další tipy R najdete na stránce „Do More With R“ na stránce YouTube nebo v seznamu „Do More With R“.