Programmering

Gør mere med R: Hurtig opslagstabeller ved hjælp af navngivne vektorer

Hvad er statens forkortelse for Arkansas? Er det AR? AK? SOM?

Måske har du en dataramme med oplysningerne. Eller nogen info hvor der er en kolonne med kategorier og en anden kolonne med værdier. Chancerne er, at du på et tidspunkt gerne vil slå op på værdi efter kategori, undertiden kendt som nøgle. Mange programmeringssprog har måder at arbejde med nøgleværdipar på. Dette er også let at gøre i R med navngivne vektorer. Sådan gør du.

Jeg har data med tilstandsnavne og forkortelser, som jeg har gemt i en dataramme, der hedder postal_df. (Koden til oprettelse af datarammen er nederst i dette indlæg, hvis du gerne vil følge med).

Jeg løber hale (postal_df) for at se hvordan det ser ud.

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

En opslagstabel / navngivet vektor har værdier som vektor og nøgler som navnene. Så lad mig først lave en vektor af værdierne, der er i PostalCode-kolonnen:

getpostalcode <- postal_df $ PostalCode

Og derefter tilføjer jeg navne fra kolonnen Stat.

names (getpostalcode) <- postal_df $ State

Til brug denne navngivne vektor som en opslagstabel, formatet er mylookupvector ['nøgle'].

Sådan får du postnummeret til Arkansas:

getpostalcode ['Arkansas']

Hvis du kun vil have værdien uden nøglen, skal du tilføje unname funktion til den værdi, du får tilbage:

unname (getpostalcode [‘Arkansas’])

Opdatering: Du kan også få kun en værdi ved hjælp af formatet getpostalcode [['Arkansas']] - det vil sige dobbelte parenteser i stedet for at tilføje unname (). Tak til Peter Harrison for tipet via Twitter. Hadley Wickham bemærker dog, at formatet med dobbelt parentes kun fungerer for en værdi. Hvis du laver noget som at oprette en ny kolonne i en dataramme, skal du holde dig til unname ().

Det er alt der er ved det. Jeg ved, at dette er et noget trivielt eksempel, men det har en vis brug i den virkelige verden. For eksempel har jeg en navngivet vektor af FIPS-koder, som jeg har brug for, når jeg arbejder med amerikanske folketællingsdata.

Jeg startede med en dataramme med stater og FIPS-koder kaldet fipsdf (koden for det er nedenfor). Dernæst oprettede jeg en vektor kaldet getfips fra datarammens fips-kodekolonne og tilføjede staterne som navne.

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

getfips <- fipsdf $ FIPS

names (getfips) <- fipsdf $ State

Hvis jeg nu vil have FIPS-koden til Massachusetts, kan jeg bruge den getfips ['Massachusetts'] . Jeg vil tilføje unname () for kun at få værdien uden navnet: unname (getfips ['Massachusetts']) .

Hvis du skal fortsætte med at bruge unname () bliver for irriterende, du kan endda lave en lille funktion fra din opslagstabel:

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

fipscode <- unname (lookupvector [state])

returner (fipscode)

}

Her har jeg to argumenter for min funktion. Den ene er min "nøgle", i dette tilfælde statens navn; den anden er lookupvector, der som standard er min getfips vektor.

Og du kan se, hvordan jeg bruger funktionen. Det er bare funktionsnavnet med et argument, tilstandsnavnet: get_state_fips ("New York") .

Jeg kan lave en funktion, der ser lidt mere generisk ud, som f.eks

get_value <- funktion (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

returner (min værdi)

}

Det har et mere generisk navn for funktionen, get_value (); et mere generisk fornavn, mykeyog et andet argument af mylookupvector det er som standard ikke noget.

Det er det samme, som jeg har gjort hele tiden: at få værdien fra opslagsvektoren med lookupvector ['nøgle'] og derefter køre unname () fungere. Men det hele er pakket ind i en funktion. Så det er lidt mere elegant at kalde det.

Jeg kan bruge den funktion med en hvilken som helst navngivet vektor, jeg har oprettet. Her bruger jeg det sammen med Arkansas og min getpostalcode vektor:get_value ("Arkansas", getpostalcode) .

Nem opslag i R! Bare husk at navne skal være unikke. Du kan gentage værdier, men ikke nøgler.

Jeg så denne idé for mange år siden i Hadley Wickham's Avanceret R Bestil. Jeg bruger det stadig meget og håber, du også finder det nyttigt.

Kode for at oprette dataramme med postforkortelser

postal_df <- data.frame (stringsAsFactors = FALSE,

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

"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 at oprette dataramme med FIPS-koder

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

"Californien", "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)