Zrób więcej z R: Szybkie tabele wyszukiwania przy użyciu nazwanych wektorów

Jaki jest skrót stanu Arkansas? Czy to jest AR? AK? TAK JAK?

Może masz ramkę danych z informacjami. Lub dowolne informacje, w których jest jedna kolumna z kategoriami i inna kolumna z wartościami. Istnieje prawdopodobieństwo, że w pewnym momencie zechcesz sprawdzić wartość według kategorii, czasami nazywanej kluczem . Wiele języków programowania ma sposoby pracy z parami klucz-wartość. Jest to łatwe do zrobienia również w R z nazwanymi wektorami. Oto jak.

Mam dane z nazwami stanów i skrótami, które zapisałem w ramce danych o nazwie postal_df. (Kod do utworzenia tej ramki danych znajduje się na dole tego posta, jeśli chcesz go śledzić).

Pobiegnę tail(postal_df)zobaczyć, jak to wygląda.

 Stan Kod pocztowy 45 Vermont VT 46 Wirginia VA 47 Waszyngton WA 48 Wirginia Zachodnia WV 49 Wisconsin WI 50 Wyoming WY

Tabela przeglądowa / nazwany wektor ma wartości jako wektor i klucze jako nazwy. Pozwólcie, że najpierw utworzę wektor wartości, które znajdują się w kolumnie PostalCode:

getpostalcode <- postal_df $ PostalCode

Następnie dodaję nazwy z kolumny Stan.

nazwy (getpostalcode) <- postal_df $ State

Aby użyć tego nazwanego wektora jako tabeli przeglądowej, należy użyć formatu mylookupvector ['klucz'].

Oto jak uzyskać kod pocztowy dla Arkansas:

getpostalcode ['Arkansas'] 

Jeśli chcesz tylko wartość, bez klucza, dodaj unnamefunkcję do tej wartości, którą otrzymasz:

unname (getpostalcode ['Arkansas'])

Aktualizacja: możesz również uzyskać tylko jedną wartość za pomocą formatu getpostalcode[['Arkansas']]- to znaczy podwójne nawiasy zamiast dodawania unname(). Podziękowania dla Petera Harrisona za wskazówkę na Twitterze. Jednak Hadley Wickham zauważa, że ​​format podwójnego nawiasu działa tylko dla jednej wartości. Jeśli robisz coś takiego jak tworzenie nowej kolumny w ramce danych, trzymaj się unname ().

To wszystko. Wiem, że jest to nieco trywialny przykład, ale ma pewne zastosowanie w świecie rzeczywistym. Na przykład mam nazwany wektor kodów FIPS, których potrzebuję podczas pracy z danymi spisu ludności USA.

Zacząłem od ramki danych zawierającej stany i wywoływane kody FIPS fipsdf(kod poniżej). Następnie utworzyłem wektor wywołany getfipsz kolumny kodu fips ramki danych i dodałem stany jako nazwy.

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

getfips <- fipsdf $ FIPS

nazwy (getfips) <- fipsdf $ State

Teraz, jeśli chcę kod FIPS dla Massachusetts, mogę użyć getfips['Massachusetts']. Dodam unname (), aby uzyskać tylko wartość bez nazwy: unname(getfips['Massachusetts']).

Jeśli ciągłe używanie unname()jest zbyt denerwujące, możesz nawet zrobić małą funkcję z tabeli przeglądowej:

get_state_fips <- function (state, lookupvector = getfips) {

fipscode <- unname (lookupvector [stan])

powrót (fipscode)

}

Tutaj mam dwa argumenty do mojej funkcji. Jeden to mój „klucz”, w tym przypadku nazwa stanu; drugi to lookupvector, który domyślnie jest moim getfipswektorem. 

Możesz zobaczyć, jak używam tej funkcji. To tylko nazwa funkcji z jednym argumentem, nazwa państwa: get_state_fips("New York").

Mogę utworzyć funkcję, która będzie wyglądać bardziej ogólnikowo, na przykład

get_value <- function (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

return (myvalue)

}

Ma bardziej ogólną nazwę funkcji get_value(),; bardziej ogólna nazwa pierwszego argumentu mykey, a drugi argument mylookupvectortego nie jest wartością domyślną.

To jest to samo, co robiłem przez cały czas: pobieranie wartości z wektora wyszukiwania, lookupvector['key']a następnie uruchamianie unname()funkcji. Ale to wszystko jest opakowane w funkcję. Więc nazwanie tego jest nieco bardziej eleganckie.

Mogę użyć tej funkcji z dowolnym nazwanym wektorem, który utworzyłem. Tutaj, używam go z Arkansas i mojego getpostalcodewektora:  get_value("Arkansas", getpostalcode).

Łatwe wyszukiwanie w R! Pamiętaj tylko, że nazwy muszą być niepowtarzalne. Możesz powtarzać wartości , ale nie klucze .

Po raz pierwszy zobaczyłem ten pomysł lata temu w książce Hadley Wickham's Advanced R. Nadal często go używam i mam nadzieję, że okaże się pomocny.

Kod do tworzenia ramki danych ze skrótami pocztowymi

postal_df <- data.frame (stringsAsFactors = FALSE,

Stan = c („Alabama”, „Alaska”, „Arizona”, „Arkansas”, „Kalifornia”,

„Kolorado”, „Connecticut”, „Delaware”, „Floryda”, „Georgia”,

„Hawaje”, „Idaho”, „Illinois”, „Indiana”, „Iowa”, „Kansas”,

„Kentucky”, „Luizjana”, „Maine”, „Maryland”, „Massachusetts”,

„Michigan”, „Minnesota”, „Mississippi”, „Missouri”, „Montana”,

„Nebraska”, „Nevada”, „New Hampshire”, „New Jersey”, „Nowy Meksyk”,

„Nowy Jork”, „Karolina Północna”, „Dakota Północna”, „Ohio”,

„Oklahoma”, „Oregon”, „Pensylwania”, „Rhode Island”, „Karolina Południowa”,

„Dakota Południowa”, „Tennessee”, „Teksas”, „Utah”, „Vermont”,

„Wirginia”, „Waszyngton”, „Wirginia Zachodnia”, „Wisconsin”, „Wyoming”),

KodPocztowy = 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”)

)

Kod do tworzenia ramki danych z kodami FIPS

fipsdf <- data.frame (State = c („Alabama”, „Alaska”, „Arizona”, „Arkansas”,

„Kalifornia”, „Kolorado”, „Connecticut”, „Delaware”, „Floryda”,

„Georgia”, „Hawaje”, „Idaho”, „Illinois”, „Indiana”, „Iowa”,

„Kansas”, „Kentucky”, „Luizjana”, „Maine”, „Maryland”, „Massachusetts”,

„Michigan”, „Minnesota”, „Mississippi”, „Missouri”, „Montana”,

„Nebraska”, „Nevada”, „New Hampshire”, „New Jersey”, „Nowy Meksyk”,

„Nowy Jork”, „Karolina Północna”, „Dakota Północna”, „Ohio”, „Oklahoma”,

„Oregon”, „Pensylwania”, „Rhode Island”, „Karolina Południowa”, „Dakota Południowa”,

„Tennessee”, „Texas”, „Utah”, „Vermont”, „Virginia”, „Washington”,

„Wirginia Zachodnia”, „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)