Programmēšana

Dariet vairāk ar R: Ātrās meklēšanas tabulas, izmantojot nosauktos vektorus

Kāds ir Arkanzasas štata saīsinājums? Vai tas ir AR? AK? KĀ?

Varbūt jums ir datu rāmis ar informāciju. Or jebkurš informācija, kur ir viena kolonna ar kategorijām un otra kolonna ar vērtībām. Iespējams, ka kādā brīdī jūs vēlaties meklēt vērtība pēc kategorijas, dažreiz to sauc arī par taustiņu. Daudzām programmēšanas valodām ir veidi, kā strādāt ar atslēgu un vērtību pāriem. To ir viegli izdarīt arī R ar nosauktiem vektoriem. Lūk, kā.

Esmu ieguvis datus ar štatu nosaukumiem un saīsinājumiem, kurus esmu saglabājis nosauktajā datu rāmī postal_df. (Kods, lai izveidotu šo datu rāmi, atrodas šīs ziņas beigās, ja vēlaties sekot līdzi).

Es skriešu aste (postal_df) lai redzētu, kā tas izskatās.

 Valsts pasta indekss 45 Vērmonta VT 46 Virdžīnija VA 47 Vašingtona WA 48 Rietumvirdžīnija WV 49 Viskonsina WI 50 Vaiominga WY

Uzmeklēšanas tabulā / nosauktajā vektorā vērtības ir vektora vērtības un atslēgas kā nosaukumi. Tāpēc ļaujiet man vispirms izveidot vērtību vektoru, kas atrodas kolonnā PostalCode:

getpostalcode <- postal_df $ PostalCode

Un pēc tam es pievienoju vārdus no kolonnas Valsts.

nosaukumi (getpostalcode) <- postal_df $ štats

Uz izmantot šis nosauktais vektors kā uzmeklēšanas tabula, formāts ir mylookupvector ['key'].

Tātad, kā iegūt Arkanzasas pasta kodu:

getpostalcode ['Arkanzasa']

Ja vēlaties tikai vērtību bez atslēgas, pievienojiet nenosaukt funkciju līdz šai vērtībai, kuru jūs atgūstat:

nenosaukums (getpostalcode [‘Arkansas’])

Atjaunināt: izmantojot formātu, varat arī iegūt tikai vienu vērtību getpostalcode [['Arkansas']] - tas ir, dubultās iekavas, nevis pievienošanas nenosaukt (). Paldies Pīteram Harisonam par padomu, izmantojot čivināt. Tomēr Hadlijs Vikhems atzīmē, ka dubultās iekavas formāts darbojas tikai vienai vērtībai. Ja jūs darāt kaut ko, piemēram, izveidojat jaunu kolonnu datu rāmī, palieciet pie nosaukuma ().

Tas viss ir. Es zinu, ka tas ir nedaudz niecīgs piemērs, taču to reāli izmanto. Piemēram, esmu ieguvis nosauktu FIPS kodu vektoru, kas man nepieciešams, strādājot ar ASV tautas skaitīšanas datiem.

Es sāku ar datu rāmi ar štatiem un FIPS kodiem fipsdf (kods tam ir zemāk). Tālāk es izveidoju vektoru ar nosaukumu getfips no datu rāmja fips koda kolonnas un pievienoja stāvokļus kā nosaukumus.

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

getfips <- fipsdf $ FIPS

nosaukumi (getfips) <- fipsdf $ štats

Tagad, ja es vēlos Masačūsetsas FIPS kodu, es varu to izmantot getfips ['Masačūsetsa'] . Es pievienotu nosaukumu (), lai iegūtu tikai vērtību bez nosaukuma: nenosaukums (getfips ['Massachusetts']) .

Ja jāturpina lietot nenosaukt () kļūst pārāk kaitinoša, jūs pat varat izveidot nelielu funkciju no savas uzmeklēšanas tabulas:

get_state_fips <- funkcija (stāvoklis, lookupvector = getfips) {

fipscode <- nenosaukums (lookvvector [stāvoklis])

atgriezties (fipscode)

}

Šeit man ir divi argumenti savai funkcijai. Viens ir mans “atslēga”, šajā gadījumā valsts nosaukums; otrs ir uzmeklētājs, kas pēc noklusējuma ir mans getfips vektors.

Un jūs varat redzēt, kā es izmantoju šo funkciju. Tas ir tikai funkcijas nosaukums ar vienu argumentu, štata nosaukums: get_state_fips ("Ņujorka") .

Es varu izveidot funkciju, kas izskatās mazliet vispārīgāka, piemēram

get_value <- funkcija (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- nenosaukums (myvalue)

atgriešanās (mana vērtība)

}

Tam ir vispārīgāks funkcijas nosaukums, get_value (); vispārīgāks pirmā argumenta nosaukums, mykey, un otrais arguments mylookupvector tas neko nedara pēc noklusējuma.

Tas ir tas pats, ko esmu darījis visu laiku: iegūstot vērtību no uzmeklēšanas vektora lookupvector ['atslēga'] un pēc tam palaist nenosaukt () funkciju. Bet tas viss ir iesaiņots funkcijas iekšpusē. Tātad, tā saukšana ir mazliet elegantāka.

Es varu izmantot šo funkciju ar jebkuru nosaukto vektoru, kuru esmu izveidojis. Lūk, es to izmantoju kopā ar Arkanzasu getpostalcode vektors:get_value ("Arkanzasa", getpostalcode) .

Viegli uzmeklējumi R! Vienkārši atcerieties, ka nosaukumiem jābūt unikāliem. Jūs varat atkārtot vērtības, bet ne taustiņus.

Es pirmo reizi redzēju šo ideju pirms gadiem Hadley Wickham’s Advanced R grāmata. Es joprojām to daudz lietoju un ceru, ka arī jums tas noderēs.

Kods, lai izveidotu datu rāmi ar pasta saīsinājumiem

postal_df <- data.frame (stringsAsFactors = FALSE,

Stāvoklis = c ("Alabama", "Aļaska", "Arizona", "Arkanzasa", "Kalifornija",

"Kolorādo", "Konektikuta", "Delavēra", "Florida", "Džordžija",

"Havaju salas", "Aidaho", "Ilinoisa", "Indiāna", "Aiova", "Kanzasa",

"Kentuki", "Luiziāna", "Meina", "Merilenda", "Masačūsetsa",

"Mičigana", "Minesota", "Misisipi", "Misūri", "Montana",

"Nebraska", "Nevada", "Ņūhempšīra", "Ņūdžersija", "Ņūmeksika",

"Ņujorka", "Ziemeļkarolīna", "Ziemeļdakota", "Ohaio",

"Oklahoma", "Oregon", "Pensilvānija", "Rodas sala", "Dienvidkarolīna",

"Dienviddakota", "Tenesī", "Teksasa", "Jūta", "Vērmonta",

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

)

Kods, lai izveidotu datu rāmi ar FIPS kodiem

fipsdf <- data.frame (štats = c ("Alabama", "Aļaska", "Arizona", "Arkanzasa",

"Kalifornija", "Kolorādo", "Konektikuta", "Delavēra", "Florida",

"Džordžija", "Havaju salas", "Aidaho", "Ilinoisa", "Indiāna", "Aiova",

"Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts",

"Mičigana", "Minesota", "Misisipi", "Misūri", "Montana",

"Nebraska", "Nevada", "Ņūhempšīra", "Ņūdžersija", "Ņūmeksika",

"Ņujorka", "Ziemeļkarolīna", "Ziemeļdakota", "Ohaio", "Oklahoma",

"Oregon", "Pensilvānija", "Rodas sala", "Dienvidkarolīna", "Dienviddakota",

"Tenesī", "Teksasa", "Jūta", "Vērmonta", "Virdžīnija", "Vašingtona",

"Rietumvirdžīnija", "Viskonsina", "Vaiominga"), 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"), virknesAsFactors = FALSE)

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