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)