আমার তুচ্ছ প্রশ্ন আছে: আমি আর-তে একটি অভিধানের ডেটা কাঠামোটি খুঁজে পাইনি, সুতরাং আমি এর পরিবর্তে তালিকাটি ব্যবহার করেছি ("শব্দ" -> সংখ্যা) সুতরাং, এখনই কীভাবে কী কী তালিকা পেতে হয় সে বিষয়ে আমার সমস্যা আছে। কেউ জানেন?
উত্তর:
হ্যাঁ, list
টাইপটি একটি ভাল আনুমানিক। আপনি names()
'কীগুলি' সেট এবং পুনরুদ্ধার করতে আপনার তালিকায় ব্যবহার করতে পারেন :
> foo <- vector(mode="list", length=3)
> names(foo) <- c("tic", "tac", "toe")
> foo[[1]] <- 12; foo[[2]] <- 22; foo[[3]] <- 33
> foo
$tic
[1] 12
$tac
[1] 22
$toe
[1] 33
> names(foo)
[1] "tic" "tac" "toe"
>
environment
প্রকারটি আর এর জন্য ব্যবহৃত হয়, তবে এটি কম সাধারণ / কম পরিচিত।
আপনার "সংখ্যা" মানগুলি যদি একই মোডের হয় তবে আপনার তালিকার দরকার নেই। আমি যদি ডার্ক এডেলবুয়েটেলের উদাহরণ নিই:
> foo <- c(12, 22, 33)
> names(foo) <- c("tic", "tac", "toe")
> foo
tic tac toe
12 22 33
> names(foo)
[1] "tic" "tac" "toe"
আপনার মানগুলি যদি মিশ্র মোডের (উদাহরণস্বরূপ অক্ষর এবং সংখ্যা) বা ভেক্টরগুলির হয় তবে কেবলমাত্র তালিকাগুলি প্রয়োজন required
উভয় তালিকা এবং ভেক্টরগুলির জন্য, একটি পৃথক উপাদান নাম দ্বারা সাবসেট করা যেতে পারে:
> foo["tac"]
tac
22
বা একটি তালিকার জন্য:
> foo[["tac"]]
[1] 22
c(12,22,33)
এই অভিধান-স্টাইলের আর কাঠামো ফু-র তালিকা খুঁজে পেতে পারেন ? unlist(lapply(FUN=function(a){foo[[a]]},X = 1:length(foo)))
খুব অসুবিধে হয়। এই জন্য কোন প্রস্তুত ফাংশন? প্রশ্নটি এখানে সরিয়ে
Calimo এর সামান্য বিস্তৃত উত্তর বাড়ানোর জন্য আমি আরে এই কোয়াটি অভিধান তৈরি করার সময় আপনাকে আরও কিছু জিনিস দরকারী মনে হতে পারে:
ক) অভিধানের সমস্ত ভ্যালু কীভাবে ফিরিয়ে আনতে হবে:
>as.numeric(foo)
[1] 12 22 33
খ) অভিধান কী কী রাখে তা পরীক্ষা করে দেখুন:
>'tic' %in% names(foo)
[1] TRUE
গ) কীভাবে নতুন কী যুক্ত করতে হবে, অভিধানে মান জোড়াটি:
সি (ফু, টিক 2 = 44)
ফলাফল:
tic tac toe tic2
12 22 33 44
ঘ) কীভাবে বাস্তব ডিকশনারির প্রয়োজনীয়তা পূরণ করবেন - কীগুলি পুনরাবৃত্তি করতে পারবেন না (অনন্য কীগুলি)? আপনাকে খ) এবং গ) একত্রিত করতে হবে এবং এমন ফাংশন তৈরি করতে হবে যা এই জাতীয় কী আছে কিনা তা যাচাই করে এবং আপনি যা চান তা করুন: উদাহরণস্বরূপ সন্নিবেশকে মঞ্জুর করবেন না, নতুনটি পুরানোটির থেকে আলাদা হলে নতুন মান তৈরি করুন, বা কোনওরকম কী পুনর্নির্মাণ করুন (উদাঃ এটিতে কিছু নম্বর যুক্ত করুন এটি অনন্য)
e) কীভাবে অভিধান থেকে কীটি যুক্ত করতে হবে:
foo <-foo [যা (foo! = foo [["ট্যাক"]])]]
c(foo, tic2=NULL)
। আশেপাশে কোন কাজ?
প্রথম স্থানে অভিধান ব্যবহারের কারণ হ'ল পারফরম্যান্স। যদিও এটি সঠিক যে সমস্যার জন্য আপনি নামযুক্ত ভেক্টর এবং তালিকাগুলি ব্যবহার করতে পারেন তা হ'ল তারা আরও ডেটা সহ যথেষ্ট ধীর এবং স্মৃতির ক্ষুধার্ত হয়ে উঠছে।
তবুও যা অনেকে জানেন না তা হ'ল আর এর একটি অন্তর্নির্মিত অভিধানের ডেটা স্ট্রাকচার রয়েছে: বিকল্পের সাথে পরিবেশগুলিhash = TRUE
কীভাবে এটি কাজ করতে হয় তার জন্য নীচের উদাহরণটি দেখুন:
# 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
সম্পাদনা করুন : এই উত্তরের ভিত্তিতে আমি আরও কিছু প্রসঙ্গে একটি ব্লগ পোস্ট লিখেছিলাম: http://blog.ephorie.de/hash-me-if-you-can
প্যাকেজ হ্যাশ এখন উপলব্ধ: https://cran.r-project.org/web/packages/hash/hash.pdf
উদাহরণ
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"
ডার্কের উত্তরের সংক্ষিপ্ত প্রকরণ:
# 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"
আমি কেবলমাত্র মন্তব্য করব আপনি table
একটি অভিধান "নকল" করার চেষ্টা করার সময় অনেক মাইলেজ পেতে পারেন , যেমন
> 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"
ইত্যাদি
as.numeric()
প্রয়োজনীয়। টেবিলটি ইতিমধ্যে সংখ্যাযুক্ত is আপনি একই ফলাফলটি পেতে পারেনnames(t[order(t)])