Programování

Udělejte více s R: Rychlé vyhledávací tabulky pomocí pojmenovaných vektorů

Jaká je státní zkratka pro Arkansas? Je to AR? AK? TAK JAKO?

Možná máte datový rámec s informacemi. Nebo žádný informace, kde je jeden sloupec s kategoriemi a druhý sloupec s hodnotami. Je pravděpodobné, že byste v určitém okamžiku chtěli vyhledat hodnota podle kategorie, někdy známé jako klíč. Mnoho programovacích jazyků má způsoby, jak pracovat s páry klíč – hodnota. To je snadné udělat i v R, s pojmenovanými vektory. Zde je návod.

Mám data se jmény stavů a ​​zkratkami, která jsem uložil v datovém rámci s názvem postal_df. (Kód pro vytvoření tohoto datového rámce je ve spodní části tohoto příspěvku, pokud jej chcete sledovat).

Běžím ocas (postal_df) vidět, jak to vypadá.

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

Vyhledávací tabulka / pojmenovaný vektor má jako vektor hodnoty a klíče jako názvy. Nejprve tedy udělám vektor hodnot, které jsou ve sloupci PostalCode:

getpostalcode <- postal_df $ PostalCode

A dále přidávám jména ze sloupce Stav.

jména (getpostalcode) <- postal_df $ Stát

Na použití tento pojmenovaný vektor jako vyhledávací tabulka má formát mylookupvector ['klíč'].

Poštovní směrovací číslo pro Arkansas tedy získáte takto:

getpostalcode ['Arkansas']

Pokud chcete pouze hodnotu, bez klíče, přidejte unname funkce na tuto hodnotu dostanete zpět:

unname (getpostalcode [‘Arkansas’])

Aktualizace: Pomocí formátu můžete také získat pouze jednu hodnotu getpostalcode [['Arkansas']] - to znamená dvojité závorky místo přidávání unname (). Děkujeme Peteru Harrisonovi za tip přes Twitter. Hadley Wickham však poznamenává, že formát dvojitých závorek funguje pouze pro jednu hodnotu. Pokud děláte něco jako vytváření nového sloupce v datovém rámci, držte se unname ().

To je vše. Vím, že se jedná o poněkud triviální příklad, ale má určité využití ve skutečném světě. Například mám pojmenovaný vektor kódů FIPS, které potřebuji při práci s daty amerického sčítání lidu.

Začal jsem datovým rámcem stavů a ​​volanými kódy FIPS fipsdf (kód je níže). Dále jsem vytvořil vektor s názvem getfips ze sloupce fips kódu datového rámce a přidal stavy jako názvy.

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

getfips <- fipsdf $ FIPS

names (getfips) <- fipsdf $ Stát

Nyní, když chci FIPS kód pro Massachusetts, mohu použít getfips ['Massachusetts'] . Přidal bych unname (), abych získal pouze hodnotu bez názvu: unname (getfips ['Massachusetts']) .

Pokud musíte pokračovat v používání unname () příliš otravné, můžete dokonce udělat malou funkci z vaší vyhledávací tabulky:

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

fipscode <- unname (lookupvector [state])

návrat (fipscode)

}

Tady mám ke své funkci dva argumenty. Jedním z nich je můj „klíč“, v tomto případě název státu; druhý je vyhledávací vektor, což je výchozí moje getfips vektor.

A můžete vidět, jak používám tuto funkci. Je to jen název funkce s jedním argumentem, název státu: get_state_fips ("New York") .

Mohu vytvořit funkci, která vypadá trochu obecněji, jako např

get_value <- funkce (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

návrat (myvalue)

}

Má obecnější název funkce, get_value (); obecnější název prvního argumentu, můj klíča druhý argument mylookupvector to nic nestanoví.

Je to totéž, co jsem dělal po celou dobu: získání hodnoty z vyhledávacího vektoru pomocí lookupvector ['key'] a poté spustit unname () funkce. Ale je to všechno zabalené uvnitř funkce. Takže volání je trochu elegantnější.

Tuto funkci mohu použít s jakýmkoli pojmenovaným vektorem, který jsem vytvořil. Tady to používám s Arkansasem a mým getpostalcode vektor:get_value ("Arkansas", getpostalcode) .

Snadné vyhledávání v R! Nezapomeňte, že jména musí být jedinečná. Můžete to opakovat hodnoty, ale ne klíče.

Poprvé jsem tento nápad viděl před lety v Hadley Wickham’s Advanced R. rezervovat. Stále to hodně používám a doufám, že vám to také pomůže.

Kód pro vytvoření datového rámce s poštovními zkratkami

postal_df <- data.frame (stringsAsFactors = FALSE,

Stát = c ("Alabama", "Aljaška", "Arizona", "Arkansas", "Kalifornie",

„Colorado“, „Connecticut“, „Delaware“, „Florida“, „Gruzie“,

„Hawaii“, „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ánie“, „Rhode Island“, „Jižní Karolína“,

„Jižní Dakota“, „Tennessee“, „Texas“, „Utah“, „Vermont“,

„Virginie“, „Washington“, „Západní Virginie“, „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 pro vytvoření datového rámce s kódy FIPS

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

„Kalifornie“, „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“, „Nové Mexiko“,

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

„Oregon“, „Pensylvánie“, „Rhode Island“, „Jižní Karolína“, „Jižní Dakota“,

„Tennessee“, „Texas“, „Utah“, „Vermont“, „Virginie“, „Washington“,

"West 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"), stringsAsFactors = FALSE)

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