Programavimas

R duomenys. Lentelės simboliai ir operatoriai, kuriuos turėtumėte žinoti

R data.table kodas tampa efektyvesnis ir elegantiškesnis, kai pasinaudojate jo specialiaisiais simboliais ir funkcijomis. Atsižvelgdami į tai, apžvelgsime keletą specialių būdų, kaip pogrupius, skaičiuoti ir kurti naujus stulpelius.

Šiai demonstracijai naudosiu 2019 m. „Stack Overflow“ kūrėjų apklausos duomenis su maždaug 90 000 atsakymų. Jei norite sekti toliau, galite atsisiųsti duomenis iš „Stack Overflow“.

Jei „data.table“ paketas nėra įdiegtas jūsų sistemoje, įdiekite jį iš CRAN ir tada įkelkite jį kaip įprasta biblioteka (data.table). Norėdami pradėti, galbūt norėsite perskaityti tik kelias pirmąsias duomenų rinkinio eilutes, kad būtų lengviau ištirti duomenų struktūrą. Tai galite padaryti naudodami „data.table’s“ duona () funkcija ir nrows argumentas. Aš perskaitysiu iš 10 eilučių:

duomenų_pavyzdys <- plinta ("duomenys / tyrimo_rezultatai_publika.csv", nrows = 10)

Kaip pamatysite, yra 85 stulpeliai, kuriuos reikia ištirti. (Jei norite sužinoti, ką reiškia visi stulpeliai, atsisiuntime yra failų su duomenų schema ir originalios apklausos PDF formatu.)

Norėdami perskaityti visus duomenis, naudosiu:

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

Tada sukursiu naują duomenų lentelę su keliais stulpeliais, kad būtų lengviau dirbti ir matyti rezultatus. Priminimas, kad data.table naudoja šią pagrindinę sintaksę:

mydt [i, j, autorius]

Paketo „data.table“ įžangoje sakoma, kad tai skaitykite taip: „paimkite dt, pogrupį arba pertvarkykite eilutes naudodami i, apskaičiuokite j ir sugrupuokite pagal.“ Atminkite, kad i ir j yra panašūs į pagrindinio R skliaustų eiliškumą: eilutės pirmos, stulpeliai antri. Taigi aš esu skirtas operacijoms, kurias atliktumėte eilutėse (eilučių pasirinkimas pagal eilučių numerius ar sąlygas); j tai, ką darytumėte su stulpeliais (pasirinkite stulpelius arba sukurkite naujus stulpelius iš skaičiavimų). Tačiau taip pat atkreipkite dėmesį, kad galite padaryti daug daugiau vidinių duomenų. Lentelės skliaustuose nei baziniame R duomenų rėmelyje. Skiltis „iki“ yra nauja data.table.

Kadangi aš pasirinkdami stulpelių, tas kodas eina „j“ vietoje, o tai reiškia, kad skliausteliuose pirmiausia reikia kablelio, kad „i“ vieta liktų tuščia:

mydt [, j]

Pasirinkite „data.table“ stulpelius

Vienas iš dalykų, kuris man patinka „data.table“, yra tai, kad lengva pasirinkti stulpelius arba cituojamas, arba nekotiruojamas. Nekotiruojama dažnai yra patogesnis (tai paprastai yra tvarkingas būdas). Bet cituojamas yra naudinga, jei naudojate „data.table“ savo funkcijose arba norite perduoti vektorių, kurį sukūrėte kur nors kitur savo kode.

Galite pasirinkti „data.table“ stulpelius tipiniu „R“ būdu, naudodami įprastą cituojamų stulpelių pavadinimų vektorių. Pavyzdžiui:

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

„OpenSourcer“, „CurrencySymbol“, „ConvertedComp“,

„Mėgėjas“)]

Jei norite jais naudotis uncituojamas, sukurkite a sąrašą vietoj a vektorius ir galite įvesti necituotus pavadinimus.

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

„OpenSourcer“, „CurrencySymbol“, „ConvertedComp“,

Mėgėjas)]

Ir dabar mes prieiname savo pirmąjį ypatingą simbolį. Užuot spausdinęs sąrašas (), galite naudoti tik tašką:

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

„OpenSourcer“, „CurrencySymbol“, „ConvertedComp“,

Mėgėjas)]

Tai .() yra spartusis klavišas sąrašas () vidiniai duomenys. lentelės skliausteliuose.

Ką daryti, jei norite naudoti jau esamą stulpelių pavadinimų vektorių? Vektorinio objekto pavadinimo įvedimas į duomenų.lentelių skliaustelius neveiks. Jei kuriu vektorių su cituojamais stulpelių pavadinimais, taip:

mycols <- c („LanguageWorkedWith“, „LanguageDesireNextYear“,

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

Tada šis kodas busne darbas:

dt1 <- mydt [, mycols]

Vietoj to, jūs turite įdėti .. (tai du taškai) prieš vektorinį objekto pavadinimą:

dt1 <- mydt [, ..mycols]

Kodėl du taškai? Tai man pasirodė kažkokia atsitiktinė, kol neperskaičiau paaiškinimo. Pagalvokite apie tai kaip apie du „Unix“ komandinės eilutės terminalo taškus, kurie perkelia jus aukštyn į vieną katalogą. Štai, jūs judate aukštyn vardų sritis, nuo duomenų viduje esančios aplinkos iki lentelės skliaustų iki pasaulinės aplinkos. (Tai tikrai padeda man tai prisiminti!)

Skaičiuokite duomenis.lentelės eilutės

Ant kito simbolio. Norėdami suskaičiuoti pagal grupes, galite naudoti duomenis.table's .N simbolis, kur.N reiškia „eilučių skaičius“. Tai gali būti bendras eilučių skaičius arba eilučių skaičius vienai grupei jei kaupiate skyriuje „pagal“.

Ši išraiška pateikia bendrą duomenų.tableto eilučių skaičių:

mydt [, .N]

Šiame pavyzdyje apskaičiuojamas eilučių, sugrupuotų pagal vieną kintamąjį, skaičius: ar apklausoje dalyvaujantys žmonės taip pat koduoja kaip hobį ( Mėgėjas kintamasis).

mydt [, .N, mėgėjas]

# grąžina:

Mėgėjų N 1: Taip 71257 2: Ne 17626

Jei yra tik vienas kintamasis, „data.table“ skliausteliuose galite naudoti paprastą stulpelio pavadinimą. Jei norite sugrupuoti pagal du ar daugiau kintamųjų, naudokite . simbolis. Pavyzdžiui:

mydt [, .N,. (mėgėjas, „OpenSourcer“)]

Norėdami užsisakyti rezultatus nuo aukščiausių iki mažiausių, galite pridėti antrą skliaustų rinkinį po pirmojo. .N simbolis automatiškai sukuria stulpelį pavadinimu N (žinoma, galite jį pervadinti, jei norite), todėl eilės tvarka pagal eilučių skaičių gali atrodyti maždaug taip:

mydt [, .N,. (mėgėjas, „OpenSourcer“)] [užsakymas (mėgėjas, -N)]

Sužinodamas „data.table“ kodą, man naudinga jį perskaityti žingsnis po žingsnio. Taigi aš tai perskaičiau kaip „Už visi eilutės mydt (kadangi nieko nėra „I“ vietoje), suskaičiuokite eilučių skaičių, grupuodami pagal „Hobbyist“ ir „OpenSourcer“. Tada pirmiausia užsisakykite „Hobbyist“, tada eilučių skaičius mažės “.

Tai prilygsta šiam „dplyr“ kodui:

mydf%>%

skaičius (mėgėjų, „OpenSourcer“)%>%

užsakymas (mėgėjas, -n)

Jei jums labiau suprantamas įprastas daugialypis metodas, šis „data.table“ kodas taip pat veikia:

mydt [, .N,

(Mėgėjas, „OpenSourcer“)] [

užsakymas (mėgėjas, -N)

]

Pridėti duomenų stulpelyje stulpelius

Tada norėčiau pridėti stulpelių, kad sužinotumėte, ar kiekvienas respondentas naudoja R, ar naudoja „Python“, ar abu, ar nenaudoja nė vieno. KalbaDirbta su stulpelyje yra informacijos apie naudojamas kalbas, o kelios tų duomenų eilutės atrodo taip:

Sharon Machlis

Kiekvienas atsakymas yra viena simbolių eilutė. Daugumoje jų yra kelios kalbos, atskirtos kabliataškiu.

Kaip dažnai būna, „Python“ yra lengviau ieškoti nei „R“, nes eilutėje negalima ieškoti „R“ (taip pat „Ruby“ ir „Rust“ taip pat yra didžiosios raidės R) taip, kaip galite ieškoti „Python“. Tai yra paprastesnis kodas, norint sukurti TRUE / FALSE vektorių, kuris tikrina, ar kiekviena eilutė yra KalbaDirbta su yra „Python“:

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

Jei mokate SQL, atpažinsite tą „patinka“ sintaksę. Man, gerai, patinka %Kaip%. Tai puikus supaprastintas būdas patikrinti modelių atitikimą. Funkcijos dokumentuose sakoma, kad ji skirta naudoti „data.table“ skliausteliuose, bet iš tikrųjų galite naudoti bet kuriame savo kode, ne tik su „data.tables“. Aš patikrinau „data.table“ kūrėją Mattą Dowle'ą, kuris sakė, kad patarimas jį naudoti skliausteliuose yra todėl, kad ten vyksta tam tikras papildomas našumo optimizavimas.

Toliau pateikiamas kodas, norint pridėti duomenų stulpelyje stulpelį „PythonUser“:

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

Atkreipkite dėmesį į := operatorius. „Python“ taip pat turi tokį operatorių, ir aš nuo tada, kai girdėjau jį vadinant „valūzų operatoriumi“, taip aš jį vadinu. Manau, kad tai oficialiai „pavedimas pagal nuorodą“. Taip yra todėl, kad aukščiau pateiktas kodas pakeitė esamą objektą dt1 data.table pridėdamas naują stulpelį - be reikia išsaugoti jį naujame kintamajame.

Norėdami ieškoti R, naudosiu įprastą išraišką „\ bR \ b“ kuriame sakoma: „Raskite šabloną, prasidedantį žodžio riba - \ b, tada an Rir tada baigti kita žodžio riba. (Negaliu ieškoti vien „R;“, nes paskutiniame kiekvienos eilutės elemente nėra kabliataškio.)

Tai prideda RUser stulpelį prie dt1:

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

Jei norite pridėti abu stulpelius vienu metu su := jums reikės paversti tą valio operatorių funkcija, užrašant jį atgaline tvarka, taip:

dt1 [, `:=`(

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

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

)]

Daugiau naudingų duomenų.lentelių operatoriai

Yra keletas kitų duomenų. Lentelių operatoriai, kuriuos verta žinoti.% tarp% operatorius turi šią sintaksę:

myvector% tarp% c (apatinė_vertė, viršutinė_vertė)

Taigi, jei noriu filtruoti visus atsakymus, kai kompensacija buvo nuo 50 000 iki 100 000, sumokėta JAV doleriais, šis kodas veikia:

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

ConvertedComp% tarp% c (50000, 100000)]

Antroji eilutė aukščiau yra tarp sąlygos. Atkreipkite dėmesį, kad % tarp% operatorius patikrindamas įtraukia tiek apatinę, tiek viršutinę vertes.

Kitas naudingas operatorius yra % smakras%. Tai veikia kaip baziniai R %% bet yra optimizuotas greičiui ir yra skirtas tik simbolių vektoriai. Taigi, jei noriu filtruoti visose eilutėse, kuriose „OpenSourcer“ stulpelis buvo „Niekada“ arba „Rečiau nei kartą per metus“, šis kodas veikia:

retos <- dt1 [„OpenSourcer“% smakras% c („Niekada“, „Rečiau nei kartą per metus“)]

Tai yra gana panašu į bazę R, išskyrus tai, kad bazė R turi nurodyti duomenų rėmelio pavadinimą skliaustelyje, o po filtro išraiškos taip pat reikia kablelio:

raros_df <- df1 [df1 $ OpenSourcer%% c („Niekada“, „Rečiau nei kartą per metus“),]

Nauja funkcija fcase ()

Šioje paskutinėje demonstracijoje pradėsiu nuo naujo duomenų lentelės sukūrimo tik su žmonėmis, kurie pranešė apie kompensaciją JAV doleriais:

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

Tada sukursiu naują stulpelį pavadinimu Kalba ar kas nors naudoja tik R, tik „Python“, abu ar ne. Ir aš naudosiu naują fcase () funkcija. Tuo metu, kai šis straipsnis buvo paskelbtas, fcase () buvo prieinama tik „data.table“ kūrimo versijoje. Jei jau turite įdiegtą „data.table“, galite atnaujinti naujausią „dev“ versiją naudodami šią komandą:

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

Funkcija fcase () yra panaši į SQL ATVEJAS, KAI pareiškimas ir dplyr's case_when () funkcija. Pagrindinė sintaksė yrafcase (sąlyga1, „vertė1“, sąlyga2, „vertė2“) ir taip toliau. Galima pridėti numatytąją reikšmę „visa kita“ numatytasis = reikšmė.

Čia yra kodas, skirtas sukurti naują stulpelį Kalba:

usd [, kalba: = fcase (

RUser &! PythonUser, „R“,

„PythonUser“ ir „! RUser“, „Python“,

„PythonUser“ ir „RUser“, „Abu“,

! PythonUser &! RUser, „Nei“

)]

Kiekvieną sąlygą dedu į atskirą eilutę, nes man lengviau skaityti, bet to nereikia.

Dėmesio: Jei naudojate „RStudio“, sukūrę naują stulpelį su valio operatorių, viršutinėje dešinėje „RStudio“ srityje data.table struktūra automatiškai neatnaujinama. Norėdami pamatyti stulpelių skaičiaus pokyčius, turite rankiniu būdu spustelėti atnaujinimo piktogramą.

Šiame straipsnyje yra keletas kitų simbolių, kurių nepaminėsiu. Jų sąrašą rasite paleidę „specialiųjų simbolių“ duomenų failo pagalbos failą pagalba („specialieji simboliai“). Vienas iš naudingiausių .SD jau turi savo straipsnį „Do More With R“ ir vaizdo įrašą „Kaip naudoti .SD R data.table pakete“.

Norėdami gauti daugiau R patarimų, eikite į „Do More With R“ puslapį arba peržiūrėkite „YouTube“ grojaraštį „Do More With R“.