Saya punya pertanyaan sepele: Saya tidak bisa menemukan struktur data kamus di R, jadi saya menggunakan daftar sebagai gantinya (seperti "kata" -> angka) Jadi, sekarang saya punya masalah bagaimana cara mendapatkan daftar kunci. Ada yang tahu?
93
environment
tipe ini digunakan untuk yang di R, tapi kurang umum / kurang dikenal.Anda bahkan tidak memerlukan daftar jika nilai "angka" Anda semuanya dalam mode yang sama. Jika saya mengambil contoh Dirk Eddelbuettel:
> foo <- c(12, 22, 33) > names(foo) <- c("tic", "tac", "toe") > foo tic tac toe 12 22 33 > names(foo) [1] "tic" "tac" "toe"
Daftar hanya diperlukan jika nilai Anda dalam mode campuran (misalnya karakter dan angka) atau vektor.
Untuk daftar dan vektor, elemen individu dapat disubset dengan nama:
> foo["tac"] tac 22
Atau untuk daftar:
> foo[["tac"]] [1] 22
sumber
c(12,22,33)
dari struktur R bergaya kamus ini?unlist(lapply(FUN=function(a){foo[[a]]},X = 1:length(foo)))
sangat merepotkan. Ada fungsi yang siap untuk ini? Pindah pertanyaan ke siniUntuk memperluas sedikit jawaban Calimo, saya menyajikan beberapa hal lagi yang mungkin berguna bagi Anda saat membuat kamus kuasi ini di R:
a) bagaimana mengembalikan semua NILAI kamus:
>as.numeric(foo) [1] 12 22 33
b) periksa apakah kamus BERISI KUNCI:
>'tic' %in% names(foo) [1] TRUE
c) cara MENAMBAHKAN kunci BARU, pasangan nilai ke kamus:
hasil:
tic tac toe tic2 12 22 33 44
d) bagaimana memenuhi persyaratan KAMUS NYATA - bahwa kunci TIDAK DAPAT mengulang (KUNCI UNIK)? Anda perlu menggabungkan b) dan c) dan fungsi build yang memvalidasi apakah ada kunci seperti itu, dan melakukan apa yang Anda inginkan: mis. Jangan izinkan penyisipan, perbarui nilai jika yang baru berbeda dari yang lama, atau buat kembali kunci entah bagaimana (mis. menambahkan beberapa nomor sehingga unik)
e) cara MENGHAPUS pasangan DENGAN KUNCI dari kamus:
sumber
c(foo, tic2=NULL)
. Ada pekerjaan di sekitar?Alasan pertama menggunakan kamus adalah kinerja. Meskipun benar bahwa Anda dapat menggunakan vektor dan daftar bernama untuk tugas tersebut, masalahnya adalah vektor tersebut menjadi sangat lambat dan haus memori dengan lebih banyak data.
Namun yang tidak diketahui banyak orang adalah bahwa R memang memiliki struktur data kamus yang terpasang: lingkungan dengan opsi
hash = TRUE
Lihat contoh berikut untuk membuatnya bekerja:
# vectorize assign, get and exists for convenience assign_hash <- Vectorize(assign, vectorize.args = c("x", "value")) get_hash <- Vectorize(get, vectorize.args = "x") exists_hash <- Vectorize(exists, vectorize.args = "x") # keys and values key<- c("tic", "tac", "toe") value <- c(1, 22, 333) # initialize hash hash = new.env(hash = TRUE, parent = emptyenv(), size = 100L) # assign values to keys assign_hash(key, value, hash) ## tic tac toe ## 1 22 333 # get values for keys get_hash(c("toe", "tic"), hash) ## toe tic ## 333 1 # alternatively: mget(c("toe", "tic"), hash) ## $toe ## [1] 333 ## ## $tic ## [1] 1 # show all keys ls(hash) ## [1] "tac" "tic" "toe" # show all keys with values get_hash(ls(hash), hash) ## tac tic toe ## 22 1 333 # remove key-value pairs rm(list = c("toe", "tic"), envir = hash) get_hash(ls(hash), hash) ## tac ## 22 # check if keys are in hash exists_hash(c("tac", "nothere"), hash) ## tac nothere ## TRUE FALSE # for single keys this is also possible: # show value for single key hash[["tac"]] ## [1] 22 # create new key-value pair hash[["test"]] <- 1234 get_hash(ls(hash), hash) ## tac test ## 22 1234 # update single value hash[["test"]] <- 54321 get_hash(ls(hash), hash) ## tac test ## 22 54321
Sunting : Atas dasar jawaban ini saya menulis posting blog dengan beberapa konteks lebih: http://blog.ephorie.de/hash-me-if-you-can
sumber
Hash paket sekarang tersedia: https://cran.r-project.org/web/packages/hash/hash.pdf
Contoh
h <- hash( keys=letters, values=1:26 ) h <- hash( letters, 1:26 ) h$a # [1] 1 h$foo <- "bar" h[ "foo" ] # <hash> containing 1 key-value pair(s). # foo : bar h[[ "foo" ]] # [1] "bar"
sumber
Variasi yang lebih pendek dari jawaban Dirk:
# Create a Color Palette Dictionary > color <- c('navy.blue', 'gold', 'dark.gray') > hex <- c('#336A91', '#F3C117', '#7F7F7F') > # Create List > color_palette <- as.list(hex) > # Name List Items > names(color_palette) <- color > > color_palette $navy.blue [1] "#336A91" $gold [1] "#F3C117" $dark.gray [1] "#7F7F7F"
sumber
Saya hanya akan berkomentar bahwa Anda bisa mendapatkan banyak manfaat
table
saat mencoba "memalsukan" kamus juga, misalnya> x <- c("a","a","b","b","b","c") > (t <- table(x)) x a b c 2 3 1 > names(t) [1] "a" "b" "c" > o <- order(as.numeric(t)) > names(t[o]) [1] "c" "a" "b"
dll.
sumber
as.numeric()
perlu. Tabel sudah berupa angka. Anda bisa mendapatkan hasil yang sama dengannames(t[order(t)])