Fai di più con R: tabelle di ricerca rapida utilizzando vettori con nome

Qual è l'abbreviazione di stato per Arkansas? È AR? AK? COME?

Forse hai un data frame con le informazioni. O qualsiasi informazione in cui è presente una colonna con categorie e un'altra colonna con valori. È probabile che a un certo punto desideri cercare il valore per categoria, a volte noto come chiave . Molti linguaggi di programmazione hanno modi per lavorare con le coppie chiave-valore. Questo è facile da fare anche in R, con vettori con nome. Ecco come.

Ho dati con nomi di stato e abbreviazioni, che ho memorizzato in un data frame denominato postal_df. (Il codice per creare quel data frame è in fondo a questo post se desideri seguirlo).

Corro tail(postal_df)a vedere che aspetto ha.

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

Una tabella di ricerca / vettore denominato ha valori come vettore e chiavi come nomi. Quindi fammi prima creare un vettore dei valori, che sono nella colonna PostalCode:

getpostalcode <- Postal_df $ PostalCode

E poi aggiungo i nomi dalla colonna Stato.

nomi (getpostalcode) <- Postal_df $ State

Per utilizzare questo vettore denominato come tabella di ricerca, il formato è mylookupvector ['chiave'].

Quindi, ecco come ottenere il codice postale per l'Arkansas:

getpostalcode ["Arkansas"] 

Se vuoi solo il valore, senza la chiave, aggiungi la unnamefunzione a quel valore che ottieni:

unname (getpostalcode ['Arkansas'])

Aggiornamento: puoi anche ottenere un solo valore utilizzando il formato getpostalcode[['Arkansas']], ovvero doppie parentesi anziché aggiungere unname(). Grazie a Peter Harrison per la segnalazione tramite Twitter. Tuttavia, Hadley Wickham osserva che il formato a doppia parentesi funziona solo per un valore. Se stai facendo qualcosa come creare una nuova colonna in un data frame, attieniti a unname ().

È tutto quello che c'è da fare. So che questo è un esempio un po 'banale, ma può essere utilizzato nel mondo reale. Ad esempio, ho un vettore con nome di codici FIPS di cui ho bisogno quando lavoro con i dati del censimento degli Stati Uniti.

Ho iniziato con un data frame di stati e codici FIPS chiamati fipsdf(il codice per quello è sotto). Successivamente, ho creato un vettore chiamato getfipsdalla colonna del codice fips del frame di dati e ho aggiunto gli stati come nomi.

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

getfips <- fipsdf $ FIPS

nomi (getfips) <- fipsdf $ State

Ora, se voglio il codice FIPS per il Massachusetts, posso usare getfips['Massachusetts']. Vorrei aggiungere innominata () per ottenere solo il valore senza il nome: unname(getfips['Massachusetts']).

Se dover continuare a utilizzare unname()diventa troppo fastidioso, puoi persino creare una piccola funzione dalla tua tabella di ricerca:

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

fipscode <- unname (lookupvector [state])

ritorno (fipscode)

}

Qui, ho due argomenti per la mia funzione. Una è la mia "chiave", in questo caso il nome dello stato; l'altro è lookupvector, che per impostazione predefinita è il mio getfipsvettore. 

E puoi vedere come uso la funzione. E 'solo il nome della funzione con un argomento, il nome dello stato: get_state_fips("New York").

Posso creare una funzione che sembri un po 'più generica, come

get_value <- function (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

return (miovalore)

}

Ha un nome più generico per la funzione get_value(),; un primo nome di argomento più generico mykey, e un secondo argomento di mylookupvectorquello non ha valore predefinito per nulla.

È la stessa cosa che ho sempre fatto: ottenere il valore dal vettore di ricerca con lookupvector['key']e quindi eseguire la unname()funzione. Ma è tutto racchiuso in una funzione. Quindi chiamarlo è un po 'più elegante.

Posso usare quella funzione con qualsiasi vettore con nome che ho creato. Qui, lo sto usando con Arkansas e il mio getpostalcodevettore:  get_value("Arkansas", getpostalcode).

Ricerche facili in R! Ricorda solo che i nomi devono essere unici. Puoi ripetere i valori , ma non le chiavi .

Ho visto questa idea per la prima volta anni fa nel libro Advanced R di Hadley Wickham . Lo uso ancora molto e spero che anche tu lo trovi utile.

Codice per creare frame di dati con abbreviazioni postali

postale_df <- data.frame (stringsAsFactors = FALSE,

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

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

)

Codice per creare frame di dati con codici FIPS

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)