Programovanie

Urobte viac s R: Rýchle vyhľadávacie tabuľky pomocou pomenovaných vektorov

Aká je štátna skratka pre Arkansas? Je to AR? AK? AKO?

Možno máte dátový rámec s informáciami. Alebo akýkoľvek informácie, kde je jeden stĺpec s kategóriami a druhý stĺpec s hodnotami. Je pravdepodobné, že v určitom okamihu by ste si chceli vyhľadať hodnotu podľa kategórie, niekedy označovanej ako kľúč. Mnoho programovacích jazykov ponúka spôsoby práce s pármi kľúč - hodnota. Toto je ľahké urobiť aj v R s pomenovanými vektormi. Tu je postup.

Mám údaje s názvami stavov a skratkami, ktoré som uložil v dátovom rámci s názvom postal_df. (Kód na vytvorenie tohto údajového rámca je v dolnej časti tohto príspevku, ak ho chcete sledovať).

Pobežím chvost (postal_df) aby sme videli, ako to vyzerá.

 State PostalCode 45 Vermont VT 46 Virginia VA 47 Washington WA 48 West Virginia WV 49 Wisconsin WI 50 Wyoming WY

Vyhľadávacia tabuľka / pomenovaný vektor má ako vektor hodnoty a kľúče ako názvy. Najprv teda urobím vektor hodnôt, ktoré sú v stĺpci PostalCode:

getpostalcode <- postal_df $ PostalCode

A ďalej pridávam mená zo stĺpca Stav.

names (getpostalcode) <- postal_df $ Štát

To použitie tento pomenovaný vektor ako vyhľadávacia tabuľka, má formát mylookupvector ['kľúč'].

Tu je návod, ako získať poštové smerovacie číslo pre Arkansas:

getpostalcode ['Arkansas']

Ak chcete iba hodnotu, bez kľúča, pridajte znak nemenovať funkciu na túto hodnotu dostanete späť:

unname (getpostalcode [‘Arkansas’])

Aktualizácia: Pomocou formátu môžete tiež získať iba jednu hodnotu getpostalcode [['Arkansas']] - to znamená dvojité zátvorky namiesto pridania unname (). Ďakujem Petrovi Harrisonovi za tip cez Twitter. Hadley Wickham však poznamenáva, že formát dvojitej zátvorky funguje iba pre jednu hodnotu. Ak robíte niečo ako vytváranie nového stĺpca v dátovom rámci, držte sa unname ().

To je všetko. Viem, že je to trochu triviálny príklad, ale má určité použitie v skutočnom svete. Napríklad mám pomenovaný vektor kódov FIPS, ktoré potrebujem pri práci s údajmi zo sčítania ľudu v USA.

Začal som dátovým rámcom stavov a volaných kódov FIPS fipsdf (kód je uvedený nižšie). Ďalej som vytvoril vektor s názvom getfips zo stĺpca fips kódu dátového rámca a pridali štáty ako názvy.

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

getfips <- fipsdf $ FIPS

names (getfips) <- fipsdf $ Štát

Teraz, keď chcem kód FIPS pre Massachusetts, môžem použiť getfips ['Massachusetts'] . Pridal by som unname (), aby som získal iba hodnotu bez názvu: unname (getfips ['Massachusetts']) .

Ak musíte pokračovať v používaní unname () príliš nepríjemné, môžete dokonca urobiť malú funkciu z vyhľadávacej tabuľky:

get_state_fips <- funkcia (stav, lookupvector = getfips) {

fipscode <- unname (vyhľadávací vektor [štát])

návrat (fipscode)

}

Tu mám k svojej funkcii dva argumenty. Jedným z nich je môj „kľúč“, v tomto prípade názov štátu; druhá je vyhľadávací vektor, ktorý je predvolene nastavený na môj getfips vektor.

A vidíte, ako používam túto funkciu. Je to iba názov funkcie s jedným argumentom, názov štátu: get_state_fips ("New York") .

Môžem vyrobiť funkciu, ktorá vyzerá trochu všeobecnejšie, ako napr

get_value <- funkcia (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

návrat (myvalue)

}

Má všeobecnejší názov pre funkciu, get_value (); všeobecnejší názov prvého argumentu, mykeya druhý argument z mylookupvector to nič predvolené nie je.

Je to to isté, čo som robil po celú dobu: získanie hodnoty z vyhľadávacieho vektora pomocou lookupvector ['key'] a potom spustiť unname () funkcia. Všetko je to však zabalené vo funkcii. Takže jeho volanie je o niečo elegantnejšie.

Túto funkciu môžem použiť s akýmkoľvek pomenovaným vektorom, ktorý som vytvoril. Tu to používam s Arkansasom a mojimi getpostalcode vektor:get_value ("Arkansas", getpostalcode) .

Jednoduché vyhľadávanie v R! Pamätajte, že mená musia byť jedinečné. Môžete opakovať hodnoty, ale nie kľúče.

Prvýkrát som tento nápad videl pred rokmi v Hadley Wickham’s Advanced R kniha. Stále ho veľa používam a dúfam, že vám tiež pomôže.

Kód na vytvorenie dátového rámca so poštovými skratkami

postal_df <- data.frame (stringsAsFactors = FALSE,

Štát = c ("Alabama", "Aljaška", "Arizona", "Arkansas", "Kalifornia",

„Colorado“, „Connecticut“, „Delaware“, „Florida“, „Gruzínsko“,

„Havaj“, „Idaho“, „Illinois“, „Indiana“, „Iowa“, „Kansas“,

„Kentucky“, „Louisiana“, „Maine“, „Maryland“, „Massachusetts“,

„Michigan“, „Minnesota“, „Mississippi“, „Missouri“, „Montana“,

„Nebraska“, „Nevada“, „New Hampshire“, „New Jersey“, „Nové Mexiko“,

„New York“, „Severná Karolína“, „Severná Dakota“, „Ohio“,

„Oklahoma“, „Oregon“, „Pensylvánia“, „Rhode Island“, „Južná Karolína“,

„Južná Dakota“, „Tennessee“, „Texas“, „Utah“, „Vermont“,

„Virgínia“, „Washington“, „Západná Virgínia“, „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“)

)

Kód na vytvorenie dátového rámca s kódmi FIPS

fipsdf <- data.frame (State = c ("Alabama", "Aljaška", "Arizona", "Arkansas",

„Kalifornia“, „Colorado“, „Connecticut“, „Delaware“, „Florida“,

„Gruzínsko“, „Havaj“, „Idaho“, „Illinois“, „Indiana“, „Iowa“,

„Kansas“, „Kentucky“, „Louisiana“, „Maine“, „Maryland“, „Massachusetts“,

„Michigan“, „Minnesota“, „Mississippi“, „Missouri“, „Montana“,

„Nebraska“, „Nevada“, „New Hampshire“, „New Jersey“, „Nové Mexiko“,

„New York“, „Severná Karolína“, „Severná Dakota“, „Ohio“, „Oklahoma“,

„Oregon“, „Pensylvánia“, „Rhode Island“, „Južná Karolína“, „Južná Dakota“,

„Tennessee“, „Texas“, „Utah“, „Vermont“, „Virgínia“, „Washington“,

"Západná Virgínia", "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“), stringsAsFactors = FALSE)

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