Ohjelmointi

Tee enemmän R: n avulla: Pikahaun taulukot käyttämällä nimettyjä vektoreita

Mikä on osavaltion lyhenne Arkansasille? Onko se AR? AK? KUTEN?

Ehkä sinulla on tietokehys tietojen kanssa. Tai minkä tahansa tiedot, joissa on yksi sarake luokkiin ja toinen sarake arvoilla. Mahdollisuudet ovat, että jossain vaiheessa haluat etsiä arvo luokittain, joskus tunnetaan nimellä avain. Monilla ohjelmointikielillä on tapoja työskennellä avainarvoparien kanssa. Tämä on helppo tehdä myös R: ssä nimetyillä vektoreilla. Näin.

Minulla on tietoja valtion nimillä ja lyhenteillä, jotka olen tallentanut nimelliseen tietokehykseen postal_df. (Koodi kyseisen tietokehyksen luomiseksi on tämän viestin alaosassa, jos haluat seurata sitä).

Minä juoksen pyrstö (postal_df) nähdäksesi miltä se näyttää.

 Osavaltion postinumero 45 Vermont VT 46 Virginia VA 47 Washington WA 48 Länsi-Virginia WV 49 Wisconsin WI 50 Wyoming WY

Hakutaulukolla / nimetyllä vektorilla on arvot vektorina ja avaimet niminä. Joten anna minun ensin tehdä vektori arvoista, jotka ovat PostalCode-sarakkeessa:

getpostalcode <- postal_df $ PostalCode

Ja seuraavaksi lisätään nimet osavaltiosarakkeesta.

nimet (getpostalcode) <- postal_df $ Tila

Vastaanottaja käyttää tämä nimetty vektori hakutaulukkona, muoto on mylookupvector ['avain'].

Joten näin saat Arkansasin postinumeron:

hae postinumero ['Arkansas']

Jos haluat vain arvon ilman avainta, lisää nimettömänä toiminto siihen arvoon, jonka saat takaisin:

Nimi (getpostinumero [’Arkansas’])

Päivitys: Voit myös saada vain yhden arvon muodon avulla hae postinumero [['Arkansas']] - toisin sanoen kaksoissulkeet lisäämisen sijaan nimetön (). Kiitos Peter Harrisonille vinkistä Twitterin kautta. Hadley Wickham huomauttaa kuitenkin, että kaksoissulkeinen muoto toimii vain yhdelle arvolle. Jos teet jotain uuden sarakkeen luomisesta datakehykseen, pysy nimettömänä ().

Siinä kaikki. Tiedän, että tämä on hieman triviaali esimerkki, mutta sillä on jonkin verran käyttöä todellisessa maailmassa. Minulla on esimerkiksi nimetty FIPS-koodien vektori, jota tarvitsen työskennellessäni Yhdysvaltain väestönlaskennan tietojen kanssa.

Aloitin valtioiden ja FIPS-koodien tietokehyksellä fipsdf (sen koodi on alla). Seuraavaksi loin vektorin nimeltä getfips datakehyksen fips-koodisarakkeesta ja lisäsi tilat niminä.

fipsdf <- rio :: import ("data / FIPS.csv")

getfips <- fipsdf $ FIPS

nimet (getfips) <- fipsdf $ Tila

Nyt jos haluan Massachusettsin FIPS-koodin, voin käyttää sitä getfips ['Massachusetts'] . Lisäisin nimeksi () saadakseni vain arvon ilman nimeä: aliasta (getfips ['Massachusetts']) .

Jos sinun on jatkettava käyttöä nimetön () tulee liian ärsyttäväksi, voit jopa tehdä pienen toiminnon hakutaulukosta:

get_state_fips <- funktio (tila, lookupvector = getfips) {

fipscode <- aliasta (hakuvektori [tila])

paluu (fipscode)

}

Minulla on kaksi argumenttia toiminnalleni. Yksi on "avain", tässä tapauksessa valtion nimi; toinen on hakuvektori, joka oletuksena on minun getfips vektori.

Ja näet kuinka käytän toimintoa. Se on vain funktion nimi yhdellä argumentilla, valtion nimi: get_state_fips ("New York") .

Voin tehdä toiminnon, joka näyttää hieman yleisemmältä, kuten

get_value <- funktio (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- nimettömyys (myvalue)

paluu (myvalue)

}

Sillä on yleisempi nimi toiminnolle, get_value (); yleisempi etuargumentin nimi, avaimeni, ja toisen argumentin mylookupvector se ei ole oletusarvoisesti mitään.

Se on sama asia, jota olen tehnyt koko ajan: saan arvon hakuvektorista hakuvektori ['avain'] ja sitten suorittaa nimetön () toiminto. Mutta kaikki on kääritty toiminnon sisälle. Joten kutsuminen on hieman tyylikkäämpi.

Voin käyttää tätä toimintoa minkä tahansa luoman vektorin kanssa. Tässä käytän sitä Arkansasin ja minun kanssa getpostinumero vektori:get_value ("Arkansas", hae postinumero) .

Helppo haku R: ssä! Muista vain, että nimien on oltava ainutlaatuisia. Voit toistaa arvot, mutta ei näppäimiä.

Näin tämän idean ensimmäisen kerran vuosia sitten Hadley Wickham'sissa Edistynyt R kirja. Käytän sitä edelleen paljon ja toivon, että löydät siitä myös hyödyllisen.

Koodi datakehyksen luomiseksi postin lyhenteillä

postal_df <- data.frame (stringsAsFactors = EPÄTOSI,

Osavaltio = c ("Alabama", "Alaska", "Arizona", "Arkansas", "Kalifornia",

"Colorado", "Connecticut", "Delaware", "Florida", "Georgia",

"Havaiji", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas",

"Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts",

"Michigan", "Minnesota", "Mississippi", "Missouri", "Montana",

"Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",

"New York", "Pohjois-Carolina", "Pohjois-Dakota", "Ohio",

"Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "Etelä-Carolina",

"Etelä-Dakota", "Tennessee", "Texas", "Utah", "Vermont",

"Virginia", "Washington", "Länsi-Virginia", "Wisconsin", "Wyoming"),

PostalCode = c ("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA",

"HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD",

"MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ",

"NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD",

"TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY")

)

Koodi datakehyksen luomiseen FIPS-koodeilla

fipsdf <- data.frame (osavaltio = c ("Alabama", "Alaska", "Arizona", "Arkansas",

"Kalifornia", "Colorado", "Connecticut", "Delaware", "Florida",

"Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa",

"Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts",

"Michigan", "Minnesota", "Mississippi", "Missouri", "Montana",

"Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",

"New York", "Pohjois-Carolina", "Pohjois-Dakota", "Ohio", "Oklahoma",

"Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota",

"Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington",

"Länsi-Virginia", "Wisconsin", "Wyoming"), FIPS = c ("01", "02",

"04", "05", "06", "08", "09", "10", "12", "13", "15", "16", "17",

"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28",

"29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",

"40", "41", "42", "44", "45", "46", "47", "48", "49", "50", "51",

"53", "54", "55", "56"), merkkijonotAsFactors = EPÄTOSI)