Направете повече с R: Таблици за бързо търсене с помощта на имена на вектори

Какво е щатското съкращение за Арканзас? АР ли е? АК? КАТО?

Може би имате кадър с данни с информацията. Или всяка информация, където има една колона с категории и друга колона със стойности. Шансовете са, че в даден момент бихте искали да търсите стойността по категория, понякога известна като ключ . Много езици за програмиране имат начини да работят с двойки ключ-стойност. Това е лесно да се направи и в R, с имена на вектори. Ето как.

Имам данни с имена на щати и съкращения, които съм съхранил в рамка с данни с име postal_df. (Кодът за създаване на тази рамка с данни е в долната част на тази публикация, ако искате да продължите).

Ще тичам tail(postal_df)да видя как изглежда.

 Държавен пощенски код 45 Вермонт VT 46 Вирджиния VA 47 Вашингтон WA 48 Западна Вирджиния WV 49 Уисконсин WI 50 Wyoming WY

Справочна таблица / именован вектор има стойности като вектор и ключове като имена. Така че нека първо направя вектор на стойностите, които са в колоната PostalCode:

getpostalcode <- postal_df $ PostalCode

След това добавям имена от колоната State.

имена (getpostalcode) <- postal_df $ State

За да се използва този именуван вектор като справочна таблица, форматът е mylookupvector ['ключ'].

Ето как да получите пощенския код за Арканзас:

getpostalcode ['Арканзас'] 

Ако искате само стойността, без ключа, добавете unnameфункцията към тази стойност, която получавате обратно:

unname (getpostalcode ['Arkansas'])

Актуализация: Можете също така да получите само една стойност, използвайки формата getpostalcode[['Arkansas']]- тоест двойни скоби, вместо да добавяте unname(). Благодаря на Питър Харисън за съвета чрез Twitter. Хадли Уикъм обаче отбелязва, че форматът с двойни скоби работи само за една стойност. Ако правите нещо като създаване на нова колона в рамка с данни, придържайте се към unname ().

Това е всичко. Знам, че това е малко тривиален пример, но има някаква реална употреба. Например имам именуван вектор от кодове на FIPS, който ми трябва при работа с данни от преброяването в САЩ.

Започнах с извикана рамка за данни за състояния и FIPS кодове fipsdf(кодът за това е по-долу). След това създадох вектор, извикан getfipsот колоната с фипс код на рамката за данни и добавих състоянията като имена.

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

getfips <- fipsdf $ FIPS

имена (getfips) <- fipsdf $ Състояние

Сега, ако искам FIPS кода за Масачузетс, мога да използвам getfips['Massachusetts']. Бих добавил unname (), за да получите само стойността без име: unname(getfips['Massachusetts']).

Ако трябва да продължите да използвате, unname()става твърде досадно, можете дори да направите малка функция от вашата справочна таблица:

get_state_fips <- функция (състояние, lookupvector = getfips) {

fipscode <- unname (lookupvector [състояние])

връщане (fipscode)

}

Тук имам два аргумента за функцията си. Единият е моят „ключ“, в случая името на държавата; другото е lookupvector, което по подразбиране е моят getfipsвектор. 

И можете да видите как използвам функцията. Това е просто името на функцията с един аргумент, името на държавата: get_state_fips("New York").

Мога да направя функция, която изглежда малко по-обща, като

get_value <- функция (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

връщане (myvalue)

}

Той има по-общо име за функцията get_value(),; по-общо име на първия аргумент mykey, и втори аргумент, mylookupvectorкойто не е по подразбиране за нищо.

Това е същото, което правех през цялото време: получаване на стойността от търсещия вектор с lookupvector['key']и след това стартиране на unname()функцията. Но всичко е обвито във функция. Така че, обаждането му е малко по-елегантно.

Мога да използвам тази функция с всеки имен вектор, който съм създал. Ето, аз съм го използвате с Арканзас и ми getpostalcodeвектор:  get_value("Arkansas", getpostalcode).

Лесно търсене в R! Само не забравяйте, че имената трябва да са уникални. Можете да повтаряте стойности , но не и клавиши .

За пръв път видях тази идея в книгата на Хадли Уикъм Advanced R. Все още го използвам много и се надявам и вие да го намерите полезен.

Код за създаване на рамка за данни с пощенски съкращения

postal_df <- data.frame (stringsAsFactors = FALSE,

Щат = c („Алабама“, „Аляска“, „Аризона“, „Арканзас“, „Калифорния“,

"Колорадо", "Кънектикът", "Делауеър", "Флорида", "Джорджия",

"Хавай", "Айдахо", "Илинойс", "Индиана", "Айова", "Канзас",

"Кентъки", "Луизиана", "Мейн", "Мериленд", "Масачузетс",

"Мичиган", "Минесота", "Мисисипи", "Мисури", "Монтана",

"Небраска", "Невада", "Ню Хемпшир", "Ню Джърси", "Ню Мексико",

"Ню Йорк", "Северна Каролина", "Северна Дакота", "Охайо",

"Оклахома", "Орегон", "Пенсилвания", "Род Айлънд", "Южна Каролина",

"Южна Дакота", "Тенеси", "Тексас", "Юта", "Върмонт",

"Вирджиния", "Вашингтон", "Западна Вирджиния", "Уисконсин", "Уайоминг"),

Пощенски код = 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")

)

Код за създаване на рамка за данни с FIPS кодове

fipsdf <- data.frame (Щат = c ("Алабама", "Аляска", "Аризона", "Арканзас",

"Калифорния", "Колорадо", "Кънектикът", "Делауеър", "Флорида",

"Джорджия", "Хавай", "Айдахо", "Илинойс", "Индиана", "Айова",

"Канзас", "Кентъки", "Луизиана", "Мейн", "Мериленд", "Масачузетс",

"Мичиган", "Минесота", "Мисисипи", "Мисури", "Монтана",

"Небраска", "Невада", "Ню Хемпшир", "Ню Джърси", "Ню Мексико",

"Ню Йорк", "Северна Каролина", "Северна Дакота", "Охайо", "Оклахома",

"Орегон", "Пенсилвания", "Род Айлънд", "Южна Каролина", "Южна Дакота",

"Тенеси", "Тексас", "Юта", "Върмонт", "Вирджиния", "Вашингтон",

"Западна Вирджиния", "Уисконсин", "Уайоминг"), 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)