Lakukan lebih banyak perkara dengan R: Jadual carian pantas menggunakan vektor bernama

Apakah singkatan negara untuk Arkansas? Adakah AR? AK? SEBAGAI?

Mungkin anda mempunyai kerangka data dengan maklumat tersebut. Atau ada maklumat di mana terdapat satu lajur dengan kategori, dan lajur lain dengan nilai. Kemungkinan, pada suatu ketika anda ingin mencari nilai mengikut kategori, kadang-kadang dikenali sebagai kunci . Banyak bahasa pengaturcaraan mempunyai cara untuk bekerja dengan pasangan kunci-nilai. Ini juga mudah dilakukan di R, dengan vektor bernama. Ini caranya.

Saya mempunyai data dengan nama negeri dan singkatan, yang saya simpan dalam kerangka data bernama postal_df. (Kod untuk membuat bingkai data berada di bahagian bawah siaran ini jika anda ingin mengikuti).

Saya akan berlari tail(postal_df)untuk melihat bagaimana rupa.

 Poskod Negeri 45 Vermont VT 46 Virginia VA 47 Washington WA 48 Virginia Barat WV 49 Wisconsin WI 50 Wyoming WY

Jadual carian / vektor bernama mempunyai nilai sebagai vektor, dan kunci sebagai namanya. Oleh itu, izinkan saya membuat vektor nilai-nilai, yang terdapat di ruangan PostalCode:

getpostalcode <- postal_df $ Poskod

Dan seterusnya saya menambah nama dari lajur Negeri.

nama (getpostalcode) <- postal_df $ Negeri

Untuk menggunakan vektor bernama ini sebagai jadual pencarian, formatnya adalah mylookupvector ['key'].

Jadi inilah cara mendapatkan kod pos untuk Arkansas:

getpostalcode ['Arkansas'] 

Sekiranya anda mahukan nilainya, tanpa kunci, tambahkan unnamefungsi ke nilai yang anda dapat kembali:

tidak dikenali (getpostalcode ['Arkansas'])

Kemas kini: Anda juga boleh mendapatkan hanya satu nilai menggunakan format getpostalcode[['Arkansas']]- iaitu kurungan berganda dan bukannya menambah unname(). Terima kasih kepada Peter Harrison atas tip melalui Twitter. Walau bagaimanapun, Hadley Wickham menyatakan bahawa format pendakap dua hanya berfungsi untuk satu nilai. Sekiranya anda melakukan sesuatu seperti membuat lajur baru dalam bingkai data, tetap tidak bernama ().

Itu sahaja yang ada. Saya tahu ini adalah contoh yang agak remeh, tetapi ia mempunyai beberapa penggunaan di dunia nyata. Sebagai contoh, saya mempunyai vektor kod FIPS bernama yang saya perlukan ketika bekerja dengan data Banci AS.

Saya mulakan dengan kerangka data negara dan kod FIPS yang disebut fipsdf(kod yang ada di bawah). Seterusnya, saya membuat vektor yang dipanggil getfipsdari lajur kod fips bingkai data dan menambahkan keadaan sebagai nama.

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

getfips <- fipsdf $ FIPS

nama (getfips) <- fipsdf $ Negeri

Sekarang jika saya mahukan kod FIPS untuk Massachusetts, saya boleh menggunakan getfips['Massachusetts']. Saya akan menambah unname () untuk mendapatkan hanya nilai tanpa nama: unname(getfips['Massachusetts']).

Sekiranya terus menggunakan unname()terlalu menjengkelkan, anda juga boleh membuat sedikit fungsi dari jadual carian anda:

get_state_fips <- fungsi (keadaan, lookupvector = getfips) {

kod fips <- unname (lookupvector [negeri])

kembali (kod fips)

}

Di sini, saya mempunyai dua hujah mengenai fungsi saya. Salah satunya adalah "kunci" saya, dalam hal ini nama negara; yang lain adalah lookupvector, yang lalai dengan getfipsvektor saya . 

Dan anda dapat melihat bagaimana saya menggunakan fungsi tersebut. Ia hanya nama fungsi dengan satu hujah, nama kerajaan: get_state_fips("New York").

Saya boleh membuat fungsi yang kelihatan sedikit lebih generik, seperti

get_value <- fungsi (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- tidak bernama (myvalue)

pulangan (nilai saya)

}

Ia mempunyai nama yang lebih umum untuk fungsi tersebut get_value(); nama argumen pertama yang lebih umum mykey, dan argumen kedua mylookupvectoryang tidak lalai untuk apa-apa.

Ini adalah perkara yang sama yang saya lakukan selama ini: mendapatkan nilai dari vektor carian lookupvector['key']dan kemudian menjalankan unname()fungsi. Tetapi semuanya terbungkus dalam fungsi. Jadi, memanggilnya lebih elegan.

Saya boleh menggunakan fungsi tersebut dengan mana-mana vektor bernama yang telah saya buat. Di sini, saya menggunakannya dengan Arkansas dan saya getpostalcodevektor:  get_value("Arkansas", getpostalcode).

Pencarian yang mudah di R! Ingatlah bahawa nama mesti unik. Anda boleh mengulang nilai , tetapi bukan kekunci .

Saya mula-mula melihat idea ini bertahun-tahun yang lalu dalam buku Advanced R Hadley Wickham . Saya masih banyak menggunakannya dan harap anda juga dapat membantu.

Kod untuk membuat bingkai data dengan singkatan pos

postal_df <- data.frame (stringsAsFactors = SALAH,

Negeri = 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", "Pulau Rhode", "Carolina Selatan",

"South Dakota", "Tennessee", "Texas", "Utah", "Vermont",

"Virginia", "Washington", "Virginia Barat", "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")

)

Kod untuk membuat bingkai data dengan kod 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", "Pulau Rhode", "Carolina Selatan", "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"), rentetanAsFactors = SALAH)