Machen Sie mehr mit R: Quick Lookup-Tabellen mit benannten Vektoren

Was ist die staatliche Abkürzung für Arkansas? Ist es AR? AK? WIE?

Vielleicht haben Sie einen Datenrahmen mit den Informationen. Oder jede Info , wo gibt es eine Spalte mit Kategorien, und eine weitere Spalte mit Werten. Möglicherweise möchten Sie irgendwann den Wert nach Kategorien nachschlagen, die manchmal als Schlüssel bezeichnet werden . Viele Programmiersprachen bieten Möglichkeiten, mit Schlüssel-Wert-Paaren zu arbeiten. Dies ist auch in R mit benannten Vektoren einfach zu bewerkstelligen. Hier ist wie.

Ich habe Daten mit Statusnamen und Abkürzungen, die ich in einem Datenrahmen mit dem Namen gespeichert habe postal_df. (Der Code zum Erstellen dieses Datenrahmens befindet sich am Ende dieses Beitrags, wenn Sie mitmachen möchten.)

Ich werde rennen, um tail(postal_df)zu sehen, wie das aussieht.

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

Eine Nachschlagetabelle / ein benannter Vektor hat Werte als Vektor und Schlüssel als Namen. Lassen Sie mich zunächst einen Vektor der Werte erstellen, die sich in der Spalte PostalCode befinden:

getpostalcode <- postal_df $ PostalCode

Und als nächstes füge ich Namen aus der Spalte Staat hinzu.

Namen (getpostalcode) <- postal_df $ State

Zur Verwendung dieses namens Vektor als Lookup - Tabelle, das Format ist mylookupvector [ ‚key‘].

So erhalten Sie die Postleitzahl für Arkansas:

getpostalcode ['Arkansas'] 

Wenn Sie nur den Wert ohne Schlüssel möchten, fügen Sie die unnameFunktion zu dem Wert hinzu, den Sie zurückerhalten:

unname (getpostalcode ['Arkansas'])

Update: Sie können mit dem Format auch nur einen Wert erhalten, dh getpostalcode[['Arkansas']]doppelte Klammern anstelle des Hinzufügens unname(). Vielen Dank an Peter Harrison für den Tipp via Twitter. Hadley Wickham merkt jedoch an, dass das Doppelklammerformat nur für einen Wert funktioniert. Wenn Sie beispielsweise eine neue Spalte in einem Datenrahmen erstellen, bleiben Sie bei unname ().

Das ist alles dazu. Ich weiß, dass dies ein etwas triviales Beispiel ist, aber es hat eine reale Verwendung. Zum Beispiel habe ich einen benannten Vektor von FIPS-Codes, den ich für die Arbeit mit US-Volkszählungsdaten benötige.

Ich begann mit einem Datenrahmen von Zuständen und FIPS-Codes fipsdf(der Code dafür ist unten). Als Nächstes habe ich einen Vektor erstellt, der getfipsaus der Fips-Code-Spalte des Datenrahmens aufgerufen wurde, und die Status als Namen hinzugefügt.

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

getfips <- fipsdf $ FIPS

names (getfips) <- fipsdf $ State

Wenn ich jetzt den FIPS-Code für Massachusetts haben möchte, kann ich ihn verwenden getfips['Massachusetts']. Ich würde unname () hinzufügen, um nur den Wert ohne den Namen zu erhalten : unname(getfips['Massachusetts']).

Wenn es unname()Ihnen zu nervig wird, weiter zu verwenden, können Sie sogar eine kleine Funktion aus Ihrer Nachschlagetabelle erstellen:

get_state_fips <- Funktion (state, lookupvector = getfips) {

fipscode <- unname (lookupvector [state])

return (fipscode)

}}

Hier habe ich zwei Argumente für meine Funktion. Einer ist mein „Schlüssel“, in diesem Fall der Statusname; Die andere ist lookupvectordie Standardeinstellung meines getfipsVektors. 

Und Sie können sehen, wie ich die Funktion benutze. Es ist nur der Funktionsname mit einem Argument, dem Statusnamen : get_state_fips("New York").

Ich kann eine Funktion erstellen, die etwas allgemeiner aussieht, wie z

get_value <- Funktion (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

return (myvalue)

}}

Es hat einen allgemeineren Namen für die Funktion get_value(); Ein allgemeinerer Name für das erste Argument mykeyund ein zweites Argument dafür mylookupvectorverwenden standardmäßig nichts.

Es ist das gleiche, was ich die ganze Zeit gemacht habe: den Wert aus dem Suchvektor mit abrufen lookupvector['key']und dann die unname()Funktion ausführen . Aber es ist alles in eine Funktion eingewickelt. Es zu nennen ist also etwas eleganter.

Ich kann diese Funktion mit jedem benannten Vektor verwenden, den ich erstellt habe. Hier verwende ich es mit Arkansas und meinem getpostalcodeVektor :  get_value("Arkansas", getpostalcode).

Einfache Suche in R! Denken Sie daran, dass Namen eindeutig sein müssen. Sie können Werte wiederholen , aber keine Tasten .

Ich habe diese Idee vor Jahren zum ersten Mal in Hadley Wickhams Advanced R- Buch gesehen. Ich benutze es immer noch oft und hoffe, dass Sie es auch hilfreich finden.

Code zum Erstellen eines Datenrahmens mit postalischen Abkürzungen

postal_df <- data.frame (stringsAsFactors = FALSE,

Zustand = c ("Alabama", "Alaska", "Arizona", "Arkansas", "Kalifornien",

"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", "OR", "PA", "RI", "SC", "SD",

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

)

Code zum Erstellen eines Datenrahmens mit FIPS-Codes

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

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