Učinite više s R: Tablice za brzo pretraživanje pomoću imenovanih vektora

Koja je kratica države za Arkansas? Je li AR? AK? KAO?

Možda imate okvir podataka s informacijama. Ili bilo koje informacije u kojima postoji jedan stupac s kategorijama, a drugi stupac s vrijednostima. Šanse su da biste u jednom trenutku htjeli potražiti vrijednost prema kategoriji, ponekad poznatoj i kao ključ . Mnogo programskih jezika ima načina za rad s parovima ključ / vrijednost. To je lako učiniti i u R, s imenovanim vektorima. Evo kako.

Imam podatke s imenima država i kraticama, koje sam pohranio u okvir podataka s imenom postal_df. (Kôd za stvaranje tog podatkovnog okvira nalazi se na dnu ovog posta ako želite slijediti).

Otrčat ću tail(postal_df)da vidim kako to izgleda.

 Državni poštanski broj 45 Vermont VT 46 Virginia VA 47 Washington WA 48 Zapadna Virginia WV 49 Wisconsin WI 50 Wyoming WY

Pregledna tablica / imenovani vektor ima vrijednosti kao vektor, a ključevi kao imena. Dakle, dopustite mi da prvo napravim vektor vrijednosti koje se nalaze u stupcu PostalCode:

getpostalcode <- postal_df $ PostalCode

I slijedeće dodajem imena iz stupca State.

imena (getpostalcode) <- postal_df $ Država

Da bi se ovaj imenovani vektor koristio kao tablica pretraživanja, format je mylookupvector ['ključ'].

Evo kako doći do poštanskog broja za Arkansas:

getpostalcode ['Arkansas'] 

Ako želite samo vrijednost, bez ključa, dodajte unnamefunkciju toj vrijednosti koju ćete dobiti natrag:

unname (getpostalcode ['Arkansas'])

Ažuriranje: Također možete dobiti samo jednu vrijednost koristeći format getpostalcode[['Arkansas']]- to jest, dvostruke zagrade umjesto dodavanja unname(). Hvala Peteru Harrisonu na savjetu putem Twittera. Međutim, Hadley Wickham primjećuje da format dvostrukih zagrada radi samo za jednu vrijednost. Ako radite nešto poput stvaranja novog stupca u podatkovnom okviru, držite se unname ().

To je sve. Znam da je ovo pomalo trivijalan primjer, ali ima neke stvarne koristi. Na primjer, imam imenovani vektor FIPS kodova koji su mi potrebni za rad s podacima američkog popisa.

Počeo sam s nazvanim okvirom podataka stanja i FIPS kodova fipsdf(kod za to je dolje). Dalje, stvorio sam vektor pozvan getfipsiz stupca fips koda podatkovnog okvira i dodao države kao imena.

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

getfips <- fipsdf $ FIPS

imena (getfips) <- fipsdf $ Država

Sad, ako želim FIPS kod za Massachusetts, mogu koristiti getfips['Massachusetts']. Ja bih dodao unname () da bi dobili samo vrijednost bez imena: unname(getfips['Massachusetts']).

Ako vam potreba za nastavkom unname()postane previše dosadna, možete čak i napraviti malu funkciju iz svoje tablice pretraživanja:

get_state_fips <- funkcija (stanje, lookupvector = getfips) {

fipscode <- unname (lookupvector [stanje])

povratak (fipscode)

}

Evo, imam dva argumenta za svoju funkciju. Jedan je moj "ključ", u ovom slučaju naziv države; druga je lookupvector, koja je zadana za moj getfipsvektor. 

I možete vidjeti kako koristim funkciju. To je samo naziv funkcije pomoću jednog argumenta, državnoj ime: get_state_fips("New York").

Mogu napraviti funkciju koja izgleda malo općenitije, kao što je

get_value <- funkcija (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

povratak (moja vrijednost)

}

Ima općenitiji naziv za funkciju get_value(),; generičnije ime prvog argumenta mykey, i drugi argument mylookupvectorkoji ne zadaje ništa.

Ista je stvar koju sam radio cijelo vrijeme: dobivanje vrijednosti iz vektora pretraživanja pomoću lookupvector['key']i zatim pokretanje unname()funkcije. Ali sve je to umotano u funkciju. Dakle, njegovo je pozivanje malo elegantnije.

Tu funkciju mogu koristiti sa bilo kojim imenovanim vektorom koji sam stvorio. Evo, ja sam ga koristite s Arkansasu i moj getpostalcodevektora:  get_value("Arkansas", getpostalcode).

Jednostavno pretraživanje u R! Samo zapamtite da imena moraju biti jedinstvena. Možete ponoviti vrijednosti , ali ne i tipke .

Tu sam ideju prvi put vidio prije nekoliko godina u knjizi Hadley Wickham Advanced R. I dalje je puno koristim i nadam se da će i vama biti od pomoći.

Kôd za stvaranje okvira podataka s poštanskim kraticama

postal_df <- data.frame (stringsAsFactors = FALSE,

Država = c ("Alabama", "Aljaska", "Arizona", "Arkansas", "Kalifornija",

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

"Havaji", "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", "Sjeverna Karolina", "Sjeverna Dakota", "Ohio",

"Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "Južna Karolina",

"Južna Dakota", "Tennessee", "Teksas", "Utah", "Vermont",

"Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"),

Poštanski broj = 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", "ILI", "PA", "RI", "SC", "SD",

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

)

Kôd za stvaranje okvira podataka s FIPS kodovima

fipsdf <- data.frame (Država = c ("Alabama", "Aljaska", "Arizona", "Arkansas",

"Kalifornija", "Kolorado", "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", "Sjeverna Karolina", "Sjeverna Dakota", "Ohio", "Oklahoma",

"Oregon", "Pennsylvania", "Rhode Island", "Južna Karolina", "Južna Dakota",

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

"Zapadna 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)