Programmering

Gjør mer med R: Hurtigoppslagstabeller ved hjelp av navngitte vektorer

Hva er den statlige forkortelsen for Arkansas? Er det AR? AK? SOM?

Kanskje du har en dataramme med informasjonen. Eller noen info der det er en kolonne med kategorier, og en annen kolonne med verdier. Sjansen er at du på et eller annet tidspunkt vil slå opp verdi etter kategori, noen ganger kjent som nøkkel. Mange programmeringsspråk har måter å jobbe med nøkkelverdipar på. Dette er enkelt å gjøre i R også med navngitte vektorer. Dette er hvordan.

Jeg har data med tilstandsnavn og forkortelser, som jeg har lagret i en dataramme som heter postal_df. (Koden for å lage den datarammen er nederst i dette innlegget hvis du vil følge med).

Jeg løper hale (postal_df) for å se hvordan det ser ut.

 State PostalCode 45 Vermont VT 46 Virginia VA 47 Washington WA 48 West Virginia WV 49 Wisconsin WI 50 Wyoming WY

En oppslagstabell / navngitt vektor har verdier som vektor, og nøkler som navn. Så la meg først lage en vektor av verdiene, som er i PostalCode-kolonnen:

getpostalcode <- postal_df $ PostalCode

Og deretter legger jeg til navn fra staten-kolonnen.

names (getpostalcode) <- postal_df $ State

Til bruk denne navngitte vektoren som en oppslagstabell, er formatet mylookupvector ['nøkkel'].

Slik får du postnummeret til Arkansas:

getpostalcode ['Arkansas']

Hvis du bare vil ha verdien, uten nøkkel, legger du til unname funksjon til den verdien du får tilbake:

unname (getpostalcode [‘Arkansas’])

Oppdatering: Du kan også få bare en verdi ved hjelp av formatet getpostalcode [['Arkansas']] - det vil si doble parenteser i stedet for å legge til unname (). Takk til Peter Harrison for tipset via Twitter. Imidlertid bemerker Hadley Wickham at formatet med dobbel brakett bare fungerer for en verdi. Hvis du gjør noe sånt som å lage en ny kolonne i en dataramme, hold deg til unname ().

Det er alt det er med det. Jeg vet at dette er et litt trivielt eksempel, men det har noe bruk i den virkelige verden. For eksempel har jeg en navngitt vektor av FIPS-koder som jeg trenger når jeg arbeider med amerikanske folketellingsdata.

Jeg startet med en dataramme med stater og FIPS-koder kalt fipsdf (koden for det er nedenfor). Deretter opprettet jeg en vektor som heter getfips fra datarammens fips-kodekolonne og la til statene som navn.

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

getfips <- fipsdf $ FIPS

names (getfips) <- fipsdf $ State

Nå hvis jeg vil ha FIPS-koden for Massachusetts, kan jeg bruke den getfips ['Massachusetts'] . Jeg vil legge til unname () for å få bare verdien uten navnet: unname (getfips ['Massachusetts']) .

Hvis du må fortsette å bruke unname () blir for irriterende, du kan til og med lage en liten funksjon fra oppslagstabellen:

get_state_fips <- funksjon (tilstand, lookupvector = getfips) {

fipscode <- unname (lookupvector [state])

retur (fipscode)

}

Her har jeg to argumenter for funksjonen min. Den ene er min “nøkkel”, i dette tilfellet navnet på staten; den andre er oppslagsvektor, som er standard til min getfips vektor.

Og du kan se hvordan jeg bruker funksjonen. Det er bare funksjonsnavnet med ett argument, navnet på staten: get_state_fips ("New York") .

Jeg kan lage en funksjon som ser litt mer generisk ut, for eksempel

get_value <- funksjon (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

returner (myvalue)

}

Den har et mer generisk navn for funksjonen, get_value (); et mer generelt fornavn, nøkkelen min, og et annet argument av mylookupvector det er ikke noe som helst.

Det er det samme jeg har gjort hele tiden: å få verdien fra oppslagsvektoren med lookupvector ['key'] og kjører deretter unname () funksjon. Men alt er pakket inn i en funksjon. Så å kalle det er litt mer elegant.

Jeg kan bruke den funksjonen med hvilken som helst navngitt vektor jeg har opprettet. Her bruker jeg den sammen med Arkansas og min getpostalcode vektor:get_value ("Arkansas", getpostalcode) .

Enkle oppslag i R! Bare husk at navnene må være unike. Du kan gjenta verdier, men ikke nøklene.

Jeg så denne ideen for mange år siden i Hadley Wickham’s Avansert R bok. Jeg bruker det fortsatt mye og håper du også synes det er nyttig.

Kode for å opprette dataramme med postforkortelser

postal_df <- data.frame (stringsAsFactors = FALSE,

State = c ("Alabama", "Alaska", "Arizona", "Arkansas", "California",

"Colorado", "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", "North Carolina", "North Dakota", "Ohio",

"Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina",

"South Dakota", "Tennessee", "Texas", "Utah", "Vermont",

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

PostalCode = 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", "ELLER", "PA", "RI", "SC", "SD",

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

)

Kode for å lage dataramme med FIPS-koder

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

"California", "Colorado", "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", "North Carolina", "North Dakota", "Ohio", "Oklahoma",

"Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota",

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

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

$config[zx-auto] not found$config[zx-overlay] not found