Ohjelmointi

R data. Taulukon symbolit ja operaattorit, jotka sinun pitäisi tietää

R data.table-koodista tulee tehokkaampi - ja tyylikäs - kun hyödynnät sen erikoismerkkejä ja toimintoja. Tässä mielessä tarkastelemme joitain erityisiä tapoja jakaa, laskea ja luoda uusia sarakkeita.

Tässä esittelyssä aion käyttää vuoden 2019 Stack Overflow -kehittäjien kyselyn tietoja noin 90 000 vastauksella. Jos haluat seurata mukana, voit ladata tiedot Stack Overflow -sovelluksesta.

Jos data.table-pakettia ei ole asennettu järjestelmään, asenna se CRAN: lta ja lataa se sitten tavalliseen tapaan kirjasto (data.table). Aluksi kannattaa ehkä lukea vain tietojoukon ensimmäiset rivit, jotta tietorakenteen tutkiminen olisi helpompaa. Voit tehdä sen datalla. Taulukot leipä () toiminto ja nrows Perustelu. Luen 10 rivillä:

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

Kuten näette, tutkittavia sarakkeita on 85. (Jos haluat tietää, mitä kaikki sarakkeet tarkoittavat, ladattavassa tiedostossa on datakaavio ja alkuperäisen kyselyn PDF-tiedosto.)

Luen kaikki tiedot käytän seuraavaa:

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

Seuraavaksi luot uuden data.taulukon, jossa on vain muutama sarake, jotta työskentely ja tulosten näkeminen olisi helpompaa. Muistutus siitä, että data.table käyttää tätä perussyntaksia:

mydt [i, j, kirjoittanut]

Data.table-paketin johdannossa sanotaan lukevan tämä seuraavasti: "ota dt, osajoukko tai järjestä rivit uudelleen i: llä, laske j, ryhmitelty". Muista, että i ja j ovat samanlaisia ​​kuin R: n hakasulkujen järjestys: rivit ensin, sarakkeet toiset. Joten olen toiminnoille, jotka tekisit riveillä (valitsemalla rivit rivinumeroiden tai ehtojen perusteella); j on se, mitä tekisit sarakkeilla (valitse sarakkeita tai luo uusia sarakkeita laskelmista). Huomaa kuitenkin myös, että voit tehdä paljon enemmän sisäisiä tietoja. Taulukon suluissa kuin R-perustietokehyksessä. Ja “by” -osio on uusi data.table-taulukossa.

Koska olen valitsemalla sarakkeissa kyseinen koodi menee j-kohtaan, mikä tarkoittaa, että suluissa on ensin pilkku, jotta i-piste jää tyhjäksi:

mydt [, j]

Valitse data.table-sarakkeet

Yksi asioista, joista pidän data.table-taulukossa, on se, että sarakkeita on helppo valita joko noteerattu tai noteeraamaton. Lainattomat on usein kätevämpää (se on tavallisesti käänteinen tapa). Mutta lainattu on hyödyllinen, jos käytät data.table-taulukkoa omien toimintojesi sisällä tai jos haluat siirtää vektorin, jonka olet luonut muualla koodissasi.

Voit valita data.table-sarakkeille tyypillisen R-pohjan tavanomaisella vektorilla, jossa on lainatut sarakkeiden nimet. Esimerkiksi:

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

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

”Harrastaja”)]

Jos haluat käyttää niitä unlainaa, luo a lista a sijasta vektori ja voit kirjoittaa lainaamattomat nimet.

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Harrastaja)]

Ja nyt olemme pääsemässä ensimmäiseen erikoissymbolimme. Sen sijaan, että kirjoittaisit lista(), voit käyttää vain pistettä:

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

OpenSourcer, CurrencySymbol, ConvertedComp,

Harrastaja)]

Että .() on pikakuvake lista() sisäiset tiedot. taulukon suluissa.

Entä jos haluat käyttää jo olemassa olevaa sarakkeiden nimien vektoria? Vektoriobjektin nimen lisääminen data.table-hakasulkeisiin ei toimi. Jos luon vektorin, jossa on lainatut sarakkeiden nimet, niin:

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

"OpenSourcer", "CurrencySymbol", "ConvertedComp", "Harrastaja")

Sitten tämä koodi tuleeei työ:

dt1 <- mydt [, mykolit]

Sen sijaan sinun täytyy laittaa .. (tämä on kaksi pistettä) vektoriobjektin nimen edessä:

dt1 <- mydt [, ..mykolit]

Miksi kaksi pistettä? Se tuntui minusta melko satunnaiselta, kunnes luin selityksen. Ajattele sitä kuin Unix-komentorivipäätteen kaksi pistettä, jotka vievät sinut ylöspäin yhdellä hakemistolla. Tässä olet siirtymässä ylöspäin nimitila, ympäristöstä data.table-taulukon suluissa globaaliin ympäristöön. (Se todella auttaa minua muistamaan sen!)

Laske data.table-rivit

Seuraava symboli. Voit laskea ryhmän mukaan käyttämällä data.table-taulukoita .N symboli, missä.N tarkoittaa "rivien lukumäärää". Se voi olla rivien kokonaismäärä tai rivien määrä ryhmää kohti jos kootaan "by" -osioon.

Tämä lauseke palauttaa data.table-taulukon rivien kokonaismäärän:

mydt [, .N]

Seuraava esimerkki laskee yhden muuttujan mukaan ryhmiteltyjen rivien lukumäärän: koodaavatko kyselyssä olevat ihmiset myös harrastusta ( Harrastaja muuttuja).

mydt [, .N, harrastaja]

# palauttaa:

Harrastaja N 1: Kyllä 71257 2: Ei 17626

Voit käyttää tavallista sarakkeen nimeä data.table-hakasulkeissa, jos muuttujia on vain yksi. Jos haluat ryhmitellä kahden tai useamman muuttujan mukaan, käytä . symboli. Esimerkiksi:

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

Jos haluat järjestää tuloksia korkeimmasta pienimpään, voit lisätä toisen hakasarjan ensimmäisen jälkeen. .N symboli luo automaattisesti sarakkeen nimeltä N (tietysti voit nimetä sen uudelleen, jos haluat), joten rivien määrän mukaan järjestäminen voi näyttää tältä:

mydt [, .N,. (harrastaja, OpenSourcer)] [järjestys (harrastaja, -N)]

Kun opin data.table-koodin, minusta on hyödyllistä lukea se vaihe vaiheelta. Joten luin tämän nimellä "For kaikki rivit mydt: ssä (koska "I" -pisteessä ei ole mitään), laske rivien määrä, ryhmitelty Hobbyistin ja OpenSourcerin mukaan. Sitten tilaa ensin harrastaja ja sitten rivien määrä laskeva. "

Se vastaa tätä dplyr-koodia:

mydf%>%

määrä (harrastaja, OpenSourcer)%>%

tilaus (harrastaja, -n)

Jos pidät tavanomaisen käänteisen tavanomaisen monirivisen lähestymistavan helpommin luettavana, tämä data.table-koodi toimii myös:

mydt [, .N,

(Harrastaja, OpenSourcer)] [

tilaus (harrastaja, -N)

]

Lisää sarakkeita data.table-taulukkoon

Seuraavaksi haluaisin lisätä sarakkeita nähdäksesi, käyttävätkö kaikki vastaajat R: tä, jos he käyttävät Pythonia, jos molempia vai eivät kumpaakaan. Kieli Työskenteli kanssa -sarakkeessa on tietoja käytetyistä kielistä, ja muutama rivi kyseisistä tiedoista näyttää tältä:

Sharon Machlis

Jokainen vastaus on yksi merkkijono. Useimmilla kielillä on useita puolipisteitä.

Kuten usein tapahtuu, Pythonin etsiminen on helpompaa kuin R, koska et voi etsiä sanaa "R" merkkijonosta (Ruby ja Rust sisältävät myös ison R: n) samalla tavalla kuin voit etsiä "Python". Tämä on yksinkertaisempi koodi luoda TOSI / EPÄTOSI-vektori, joka tarkistaa, onko kukin merkkijono sisään Kieli Työskenteli kanssa sisältää Python:

ifelse (LanguageWorkedWith% kuten% "Python", TOSI, EPÄTOSI)

Jos tunnet SQL: n, tunnistat kyseisen "tykkää" -syntaksin. Minä, kuten, pidän %Kuten%. Se on mukava virtaviivainen tapa tarkistaa kuvien yhteensopivuus. Toimintojen ohjeiden mukaan se on tarkoitettu käytettäväksi data.table-suluissa, mutta itse asiassa voit käyttää sitä missä tahansa koodissasi, ei vain data.table-taulukoiden kanssa. Tarkistin data.table-luojalla Matt Dowle, joka sanoi, että neuvoja käyttää sitä suluissa on, koska siellä tapahtuu jonkin verran ylimääräistä suorituskyvyn optimointia.

Seuraavaksi tässä on koodi lisätä PythonUser-sarake data.table-taulukkoon:

dt1 [, PythonUser: = ifelse (LanguageWorkedWith% kuten% "Python", TOSI, EPÄTOSI]]

Huomaa := operaattori. Pythonilla on myös tällainen operaattori, ja siitä lähtien, kun kuulin sen kutsuvan "mursaoperaattoriksi", niin kutsun sitä. Luulen, että se on virallisesti "viite". Tämä johtuu siitä, että yllä oleva koodi muutti olemassa olevaa objektia dt1 data.table lisäämällä uusi sarake - ilman täytyy tallentaa se uuteen muuttujaan.

Jos haluat etsiä sanaa R, käytän säännöllistä lauseketta "\ bR \ b" joka sanoo: ”Etsi kuvio, joka alkaa sanarajasta - \ b, sitten Rja lopeta sitten toisella sanarajalla. (En voi vain etsiä sanaa R; koska jokaisen merkkijonon viimeisessä kohdassa ei ole puolipistettä.)

Tämä lisää RUser-sarakkeen dt1:

dt1 [, RUser: = ifelse (LanguageWorkedWith% kuten% "\ bR \ b", TOSI, EPÄTOSI)]

Jos haluat lisätä molemmat sarakkeet kerralla := sinun on muutettava mursun operaattori funktioksi lainaamalla se takaisin seuraavasti:

dt1 [, `:=`(

PythonUser = ifelse (LanguageWorkedWith% kuten% "Python", TOSI, EPÄTOSI),

RUser = ifelse (LanguageWorkedWith% kuten% "\ bR \ b", TOSI, EPÄTOSI)

)]

Lisää hyödyllisiä tietoja. Taulukko-operaattorit

On olemassa useita muita data.table-operaattoreita, jotka kannattaa tietää.%välillä% operaattorilla on tämä syntakse:

myvector% välillä% c (alempi_arvo, ylempi_arvo)

Joten jos haluan suodattaa kaikki vastaukset, joissa korvaus oli 50 000 - 100 000 Yhdysvaltain dollareina, tämä koodi toimii:

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

ConvertedComp% välillä% c (50000, 100000)]

Toinen yllä oleva rivi on ehdon välinen. Huomaa, että %välillä% operaattori sisällyttää sekä ala- että yläarvot tarkistettaessa.

Toinen hyödyllinen operaattori on %leuka%. Se toimii kuin R-pohja %sisään% mutta on optimoitu nopeudelle ja on vain merkkivektorit. Joten, jos haluan suodattaa kaikki rivit, joissa OpenSourcer-sarake oli joko "Ei koskaan" tai "Vähemmän kuin kerran vuodessa", tämä koodi toimii:

harvinainen <- dt1 [OpenSourcer% leuka% c ("Ei koskaan", "Vähemmän kuin kerran vuodessa")]

Tämä on melko samanlainen kuin tukiasema R, paitsi että tukiaseman R on määritettävä tietokehyksen nimi suluissa ja vaaditaan myös pilkku suodatinlausekkeen jälkeen:

harvinainen_df <- df1 [df1 $ OpenSourcer%% c: ssä ("Ei koskaan", "Vähemmän kuin kerran vuodessa"),]

Uusi fcase () -toiminto

Tätä viimeistä demoa varten aloitan luomalla uuden data.taulukon, jossa on vain ihmisiä, jotka ilmoittivat korvauksen Yhdysvaltain dollareina:

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

Seuraavaksi luon uuden sarakkeen nimeltä Kieli käyttääkö joku vain R: ää, vain Pythonia, molempia vai kumpaakaan. Ja käytän uutta fcase () toiminto. Tämän artikkelin julkaisuhetkellä fcase () oli saatavana vain data.table-sovelluksen kehitysversiossa. Jos data.table on jo asennettu, voit päivittää uusimpaan dev-versioon tällä komennolla:

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

Fcase () -funktio on samanlainen kuin SQL TAPAHTUMA MILLOIN lausunto ja dplyr's case_when () toiminto. Perussyntaksi onfcase (ehto1, "arvo1", ehto2, "arvo2") ja niin edelleen. Kaikkien muiden oletusarvo voidaan lisätä oletus = arvo.

Tässä on koodi uuden Kieli -sarakkeen luomiseen:

usd [, kieli: = fcase (

RUser &! PythonUser, "R",

PythonUser &! RUser, "Python",

PythonUser & RUser, "Molemmat",

! PythonUser &! RUser, "Kumpikaan"

)]

Laitoin jokaisen ehdon erilliselle riville, koska minusta on helpompi lukea, mutta sinun ei tarvitse.

Varoitus: Jos käytät RStudio-ohjelmaa, data.table-rakenne ei päivity automaattisesti oikeassa yläkulmassa olevaan RStudio-ruutuun, kun olet luonut uuden sarakkeen murskaoperaattorilla. Sinun on napsautettava päivityskuvaketta manuaalisesti, jotta näet muutokset sarakkeiden määrässä.

Tässä artikkelissa on muutama muu symboli, joita en käsittele. Löydät luettelon niistä "erityissymbolit" data.table-ohjetiedostosta suorittamalla ohje ("erikoissymbolit"). Yhdellä hyödyllisimmistä .SD: llä on jo oma Do More With -artikkeli ja -video ".SD: n käyttö R data.table-paketissa".

Saat lisää R-vinkkejä siirtymällä Tee enemmän R: llä -sivulle tai tutustumalla YouTube-soittolistaan ​​Tee enemmän R: llä.