Faites-en plus avec R: tables de recherche rapide utilisant des vecteurs nommés

Quelle est l'abréviation d'état de l'Arkansas? Est-ce AR? AK? COMME?

Peut-être avez-vous un bloc de données avec les informations. Ou toute information contenant une colonne avec des catégories et une autre colonne avec des valeurs. Il y a de fortes chances que vous souhaitiez, à un moment donné, rechercher la valeur par catégorie, parfois appelée clé . De nombreux langages de programmation ont des moyens de travailler avec des paires clé-valeur. C'est aussi facile à faire dans R, avec des vecteurs nommés. Voici comment.

J'ai des données avec des noms d'état et des abréviations, que j'ai stockées dans un bloc de données nommé postal_df. (Le code pour créer ce bloc de données est au bas de cet article si vous souhaitez suivre).

Je vais courir tail(postal_df)pour voir à quoi ça ressemble.

 State PostalCode 45 Vermont VT 46 Virginie VA 47 Washington WA 48 Virginie-Occidentale WV 49 Wisconsin WI 50 Wyoming WY

Une table de consultation / un vecteur nommé a des valeurs comme vecteur et des clés comme noms. Alors laissez-moi d'abord faire un vecteur des valeurs, qui sont dans la colonne PostalCode:

getpostalcode <- postal_df $ PostalCode

Et ensuite, j'ajoute des noms de la colonne État.

names (getpostalcode) <- postal_df $ State

Pour utiliser ce vecteur nommé comme table de recherche, le format est mylookupvector ['key'].

Alors, voici comment obtenir le code postal de l'Arkansas:

getpostalcode ['Arkansas'] 

Si vous voulez juste la valeur, sans la clé, ajoutez la unnamefonction à cette valeur que vous récupérez:

unname (getpostalcode ['Arkansas'])

Mise à jour: vous pouvez également obtenir une seule valeur en utilisant le format getpostalcode[['Arkansas']], c'est-à-dire des crochets doubles au lieu d'ajouter unname(). Merci à Peter Harrison pour le tuyau via Twitter. Cependant, Hadley Wickham note que le format à double crochet ne fonctionne que pour une valeur. Si vous faites quelque chose comme créer une nouvelle colonne dans un bloc de données, tenez-vous-en à unname ().

C'est tout ce qu'on peut en dire. Je sais que c'est un exemple quelque peu trivial, mais il a une certaine utilisation dans le monde réel. Par exemple, j'ai un vecteur nommé de codes FIPS dont j'ai besoin lorsque je travaille avec les données du recensement américain.

J'ai commencé avec une trame de données d'états et de codes FIPS appelés fipsdf(le code pour cela est ci-dessous). Ensuite, j'ai créé un vecteur appelé à getfipspartir de la colonne de code fips du bloc de données et j'ai ajouté les états en tant que noms.

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

getfips <- fipsdf $ FIPS

names (getfips) <- fipsdf $ State

Maintenant, si je veux le code FIPS pour le Massachusetts, je peux l'utiliser getfips['Massachusetts']. Je voudrais ajouter unname () pour obtenir juste la valeur sans le nom: unname(getfips['Massachusetts']).

Si continuer à utiliser unname()devient trop ennuyeux, vous pouvez même créer une petite fonction à partir de votre table de consultation:

get_state_fips <- fonction (état, lookupvector = getfips) {

fipscode <- unname (lookupvector [état])

retour (fipscode)

}

Ici, j'ai deux arguments pour ma fonction. L'un est ma «clé», dans ce cas le nom de l'État; l'autre est lookupvector, qui par défaut est mon getfipsvecteur. 

Et vous pouvez voir comment j'utilise la fonction. Il est juste le nom de la fonction avec un argument, le nom de l' État: get_state_fips("New York").

Je peux créer une fonction qui semble un peu plus générique, telle que

get_value <- fonction (mykey, mylookupvector) {

mavaleur <- mylookupvector [mykey]

mavaleur <- unname (mavaleur)

return (ma valeur)

}

Il a un nom plus générique pour la fonction get_value(),; un premier nom d'argument plus générique mykey, et un second argument de mylookupvectorcelui-ci ne par défaut à rien.

C'est la même chose que je fais depuis le début: obtenir la valeur du vecteur de recherche avec lookupvector['key']puis exécuter la unname()fonction. Mais tout est enveloppé dans une fonction. Donc, l'appeler est un peu plus élégant.

Je peux utiliser cette fonction avec n'importe quel vecteur nommé que j'ai créé. Ici, je l' utilise avec l' Arkansas et mon getpostalcodevecteur:  get_value("Arkansas", getpostalcode).

Recherches faciles dans R! N'oubliez pas que les noms doivent être uniques. Vous pouvez répéter des valeurs , mais pas des clés .

J'ai vu cette idée pour la première fois il y a des années dans le livre Advanced R de Hadley Wickham . Je l'utilise encore beaucoup et j'espère que vous le trouverez également utile.

Code pour créer un bloc de données avec des abréviations postales

postal_df <- data.frame (stringsAsFactors = FALSE,

État = c ("Alabama", "Alaska", "Arizona", "Arkansas", "Californie",

"Colorado", "Connecticut", "Delaware", "Floride", "Géorgie",

"Hawaï", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas",

"Kentucky", "Louisiane", "Maine", "Maryland", "Massachusetts",

"Michigan", "Minnesota", "Mississippi", "Missouri", "Montana",

"Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",

"New York", "Caroline du Nord", "Dakota du Nord", "Ohio",

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

"Dakota du Sud", "Tennessee", "Texas", "Utah", "Vermont",

«Virginie», «Washington», «Virginie occidentale», «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 pour créer une trame de données avec des codes FIPS

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

"Californie", "Colorado", "Connecticut", "Delaware", "Floride",

"Géorgie", "Hawaï", "Idaho", "Illinois", "Indiana", "Iowa",

"Kansas", "Kentucky", "Louisiane", "Maine", "Maryland", "Massachusetts",

"Michigan", "Minnesota", "Mississippi", "Missouri", "Montana",

"Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",

"New York", "Caroline du Nord", "Dakota du Nord", "Ohio", "Oklahoma",

«Oregon», «Pennsylvanie», «Rhode Island», «Caroline du Sud», «Dakota du Sud»,

«Tennessee», «Texas», «Utah», «Vermont», «Virginia», «Washington»,

"Virginie-Occidentale", "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)