Lakukan lebih banyak dengan R: Tabel pencarian cepat menggunakan vektor bernama

Apa singkatan negara bagian untuk Arkansas? Apakah itu AR? AK? SEBAGAI?

Mungkin Anda memiliki bingkai data dengan informasi tersebut. Atau info apa pun di mana ada satu kolom dengan kategori, dan kolom lain dengan nilai. Kemungkinannya adalah, pada titik tertentu Anda ingin mencari nilai berdasarkan kategori, terkadang dikenal sebagai kunci . Banyak bahasa pemrograman memiliki cara untuk bekerja dengan pasangan nilai kunci. Ini juga mudah dilakukan di R, dengan vektor bernama. Begini caranya.

Saya mendapatkan data dengan nama negara bagian dan singkatan, yang telah saya simpan dalam bingkai data bernama postal_df. (Kode untuk membuat bingkai data itu ada di bagian bawah posting ini jika Anda ingin mengikutinya).

Saya akan lari tail(postal_df)untuk melihat seperti apa itu.

 Kode Pos Negara Bagian 45 Vermont VT 46 Virginia VA 47 Washington WA 48 Virginia Barat WV 49 Wisconsin WI 50 Wyoming WY

Tabel pemeta / vektor bernama memiliki nilai sebagai vektor, dan kunci sebagai namanya. Jadi izinkan saya pertama-tama membuat vektor nilai, yang ada di kolom KodePos:

getpostalcode <- postal_df $ PostalCode

Dan selanjutnya saya menambahkan nama dari kolom Negara.

nama (getpostalcode) <- postal_df $ State

Untuk menggunakan vektor bernama ini sebagai tabel pemeta, formatnya adalah mylookupvector ['key'].

Jadi, inilah cara mendapatkan kode pos untuk Arkansas:

getpostalcode ['Arkansas'] 

Jika Anda hanya menginginkan nilainya, tanpa kunci, tambahkan unnamefungsi ke nilai yang Anda dapatkan kembali:

hapus nama (getpostalcode ['Arkansas'])

Pembaruan: Anda juga bisa mendapatkan hanya satu nilai menggunakan format getpostalcode[['Arkansas']]- yaitu, tanda kurung ganda daripada menambahkan unname(). Terima kasih kepada Peter Harrison atas tipnya melalui Twitter. Namun, Hadley Wickham mencatat bahwa format kurung ganda hanya berfungsi untuk satu nilai. Jika Anda melakukan sesuatu seperti membuat kolom baru dalam bingkai data, tetap gunakan unname ().

Itu saja yang ada untuk itu. Saya tahu ini adalah contoh yang agak sepele, tetapi memiliki beberapa penggunaan di dunia nyata. Misalnya, saya mendapatkan vektor bernama kode FIPS yang saya perlukan saat bekerja dengan data Sensus AS.

Saya mulai dengan kerangka data negara bagian dan kode FIPS yang disebut fipsdf(kode untuk itu ada di bawah). Selanjutnya, saya membuat vektor yang dipanggil getfipsdari kolom kode fips bingkai data dan menambahkan status sebagai nama.

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

getfips <- fipsdf $ FIPS

nama (getfips) <- fipsdf $ State

Sekarang jika saya ingin kode FIPS untuk Massachusetts, saya bisa gunakan getfips['Massachusetts']. Saya akan menambahkan unname () untuk mendapatkan hanya nilai tanpa nama: unname(getfips['Massachusetts']).

Jika harus terus menggunakan unname()terlalu mengganggu, Anda bahkan dapat membuat sedikit fungsi dari tabel pencarian Anda:

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

fipscode <- unname (lookupvector [state])

kembali (kode fips)

}

Di sini, saya punya dua argumen untuk fungsi saya. Salah satunya adalah "kunci" saya, dalam hal ini nama negara bagian; yang lainnya adalah lookupvector, yang defaultnya ke getfipsvektor saya . 

Dan Anda dapat melihat bagaimana saya menggunakan fungsinya. Itu hanya nama fungsi dengan satu argumen, nama negara: get_state_fips("New York").

Saya bisa membuat fungsi yang terlihat sedikit lebih umum, seperti

get_value <- function (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

kembali (nilai saya)

}

Ini memiliki nama yang lebih umum untuk fungsi tersebut get_value(),; nama argumen pertama yang lebih umum mykey,, dan argumen kedua mylookupvectortidak default ke apa pun.

Ini adalah hal yang sama yang telah saya lakukan selama ini: mendapatkan nilai dari vektor pencarian dengan lookupvector['key']dan kemudian menjalankan unname()fungsinya. Tapi itu semua dibungkus dalam sebuah fungsi. Jadi, menyebutnya sedikit lebih elegan.

Saya dapat menggunakan fungsi itu dengan vektor bernama apa pun yang saya buat. Di sini, saya menggunakan dengan Arkansas dan saya getpostalcodevektor:  get_value("Arkansas", getpostalcode).

Pencarian mudah di R! Ingatlah bahwa nama harus unik. Anda dapat mengulang nilai , tetapi tidak kunci .

Saya pertama kali melihat ide ini bertahun-tahun yang lalu dalam buku Advanced R Hadley Wickham . Saya masih sering menggunakannya dan berharap Anda juga merasa terbantu.

Kode untuk membuat bingkai data dengan singkatan pos

postal_df <- data.frame (stringsAsFactors = FALSE,

Negara Bagian = 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", "Carolina Utara", "Dakota Utara", "Ohio",

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

"Dakota Selatan", "Tennessee", "Texas", "Utah", "Vermont",

"Virginia", "Washington", "Virginia Barat", "Wisconsin", "Wyoming"),

Kode Pos = 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")

)

Kode untuk membuat bingkai data dengan kode FIPS

fipsdf <- data.frame (Negara Bagian = 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", "Carolina Utara", "Dakota Utara", "Ohio", "Oklahoma",

"Oregon", "Pennsylvania", "Rhode Island", "Carolina Selatan", "Dakota Selatan",

"Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington",

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