Programiranje

Naredite več z R: tabele za hitro iskanje z uporabo imenovanih vektorjev

Kakšna je državna okrajšava za Arkansas? Je AR? AK? AS?

Mogoče imate podatkovni okvir z informacijami. Ali kaj informacije, kjer je en stolpec s kategorijami in drug stolpec z vrednostmi. Verjetno bi v nekem trenutku želeli poiskati vrednost po kategorijah, včasih znana tudi kot tipko. Veliko programskih jezikov ima načine za delo s pari ključ-vrednost. Tudi v R je to enostavno narediti z imenovanimi vektorji. Evo kako.

Imam podatke z imeni držav in okrajšavami, ki sem jih shranil v podatkovni okvir z imenom postal_df. (Koda za ustvarjanje tega podatkovnega okvira je na dnu te objave, če želite nadaljevati).

Tekel bom rep (poštna_df) da vidim, kako je to videti.

 Poštna številka 45 Vermont VT 46 Virginia VA 47 Washington WA 48 Zahodna Virginia WV 49 Wisconsin WI 50 Wyoming WY

Iskalna tabela / imenovani vektor ima vrednosti kot vektor in ključe kot imena. Naj najprej najprej naredim vektor vrednosti, ki so v stolpcu PostalCode:

getpostalcode <- postal_df $ PostalCode

Nato dodam imena iz stolpca State.

imena (getpostalcode) <- postal_df $ State

Za uporaba ta imenovani vektor kot iskalna tabela je oblika mylookupvector ['ključ'].

Torej, kako dobiti poštno številko za Arkansas:

getpostalcode ['Arkansas']

Če želite samo vrednost, brez ključa, dodajte unname funkcijo do te vrednosti, ki jo dobite nazaj:

unname (getpostalcode [‘Arkansas’])

Posodobitev: Z obliko lahko dobite tudi samo eno vrednost getpostalcode [['Arkansas']] - to je dvojni oklepaji namesto dodajanja unname (). Hvala Petru Harrisonu za nasvet prek Twitterja. Vendar Hadley Wickham ugotavlja, da oblika dvojnih oklepajev deluje samo za eno vrednost. Če počnete nekaj podobnega ustvarjanju novega stolpca v podatkovnem okviru, se držite unname ().

To je vse. Vem, da je to nekoliko nepomemben primer, vendar ima nekaj resnične uporabe. Na primer, imam imenovani vektor kod FIPS, ki ga potrebujem pri delu s podatki ameriškega popisa.

Začel sem z imenovanim podatkovnim okvirom stanj in kod FIPS fipsdf (koda za to je spodaj). Nato sem ustvaril vektor z imenom getfips iz stolpca kode fipsa podatkovnega okvira in države dodal kot imena.

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

getfips <- fipsdf $ FIPS

imena (getfips) <- fipsdf $ State

Zdaj, če želim kodo FIPS za Massachusetts, lahko uporabim getfips ['Massachusetts'] . Dodal bi unname (), da dobim samo vrednost brez imena: unname (getfips ['Massachusetts']) .

Če bi morali še naprej uporabljati unname () postane preveč siten, lahko celo naredite malo funkcije iz iskalne tabele:

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

fipscode <- unname (lookupvector [stanje])

vrnitev (fipscode)

}

Tukaj imam dva argumenta za svojo funkcijo. Eden je moj "ključ", v tem primeru ime države; drugi pa je lookupvector, ki je privzeto za mojo getfips vektor.

In vidite, kako uporabljam funkcijo. To je samo ime funkcije z enim argumentom, ime države: get_state_fips ("New York") .

Lahko naredim funkcijo, ki je videti nekoliko bolj splošna, na primer

get_value <- funkcija (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

vrnitev (moja vrednost)

}

Ima bolj splošno ime za funkcijo, get_value (); bolj splošno ime prvega argumenta, mykey, in drugi argument mylookupvector to ni nič privzeto.

To je isto, kar sem počel ves čas: pridobivanje vrednosti iz vektorja iskanja z lookupvector ['key'] in nato zaženite unname () funkcijo. Ampak vse je zavito v funkcijo. Klicanje je torej nekoliko bolj elegantno.

To funkcijo lahko uporabljam s katerim koli imenovanim vektorjem, ki sem ga ustvaril. Tukaj ga uporabljam z Arkansasom in mojim getpostalcode vektor:get_value ("Arkansas", getpostalcode) .

Preprosta iskanja v R! Samo ne pozabite, da morajo biti imena unikatna. Lahko ponovite vrednote, vendar ne tipke.

To idejo sem prvič videl pred leti pri Hadleyju Wickhamu Napredno R knjigo. Še vedno ga veliko uporabljam in upam, da vam bo tudi v pomoč.

Koda za ustvarjanje podatkovnega okvira s poštnimi okrajšavami

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

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

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

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

Poštna številka = 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")

)

Koda za ustvarjanje podatkovnega okvira s kodami FIPS

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", "Severna Karolina", "Severna Dakota", "Ohio", "Oklahoma",

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

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

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