আর / তে অভিধানের সাথে কাজ করা


94

আমার তুচ্ছ প্রশ্ন আছে: আমি আর-তে একটি অভিধানের ডেটা কাঠামোটি খুঁজে পাইনি, সুতরাং আমি এর পরিবর্তে তালিকাটি ব্যবহার করেছি ("শব্দ" -> সংখ্যা) সুতরাং, এখনই কীভাবে কী কী তালিকা পেতে হয় সে বিষয়ে আমার সমস্যা আছে। কেউ জানেন?

উত্তর:


121

হ্যাঁ, 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"
> 

18
ওপির অকার্যকর পদ্ধতির কোনও শব্দ ছাড়াই প্রশ্নের উত্তর দেওয়ার জন্য +1।
মারেক

4
অভিধানের জন্য প্রক্সি হিসাবে তালিকার ব্যবহারের উপর নির্ভর করে এটি মনে রাখা বুদ্ধিমানের কাজ হতে পারে যে তালিকার জন্য "কী" অনুসন্ধান হ'ল ও (1) এর পরিবর্তে ও (এন), যা আপনি আশা করছেন একটি অভিধান (যা কীগুলি হ্যাশ করে)।
egnha

4
হ্যাঁ, environmentপ্রকারটি আর এর জন্য ব্যবহৃত হয়, তবে এটি কম সাধারণ / কম পরিচিত।
ডার্ক এডেলবুয়েটেল

59

আপনার "সংখ্যা" মানগুলি যদি একই মোডের হয় তবে আপনার তালিকার দরকার নেই। আমি যদি ডার্ক এডেলবুয়েটেলের উদাহরণ নিই:

> 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

4
আপনি কীভাবে c(12,22,33)এই অভিধান-স্টাইলের আর কাঠামো ফু-র তালিকা খুঁজে পেতে পারেন ? unlist(lapply(FUN=function(a){foo[[a]]},X = 1:length(foo)))খুব অসুবিধে হয়। এই জন্য কোন প্রস্তুত ফাংশন? প্রশ্নটি এখানে সরিয়ে
নিয়েছেন

18

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 [["ট্যাক"]])]]


আমি কি স্পেস রয়েছে এমন কী যুক্ত করতে পারি, 'অদ্ভুত কী'র মতো?
ব্যবহারকারী 1700890

এছাড়াও এর মতো কিছু কাজ করে না c(foo, tic2=NULL)। আশেপাশে কোন কাজ?
ব্যবহারকারী 1700890

16

প্রথম স্থানে অভিধান ব্যবহারের কারণ হ'ল পারফরম্যান্স। যদিও এটি সঠিক যে সমস্যার জন্য আপনি নামযুক্ত ভেক্টর এবং তালিকাগুলি ব্যবহার করতে পারেন তা হ'ল তারা আরও ডেটা সহ যথেষ্ট ধীর এবং স্মৃতির ক্ষুধার্ত হয়ে উঠছে।

তবুও যা অনেকে জানেন না তা হ'ল আর এর একটি অন্তর্নির্মিত অভিধানের ডেটা স্ট্রাকচার রয়েছে: বিকল্পের সাথে পরিবেশগুলি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


এটি বহুবিধ সম্পর্কের জন্য কাজ করে? উদাহরণস্বরূপ টিক = 1 এবং টিক = 17
স্ক্যান

@ সাকান: আপনি কেন চেষ্টা করে দেখছেন না?
ভনজড

নামের সাথে তালিকাগুলি ব্যবহারের জায়গায় এই পদ্ধতির ব্যবহারটি আমার চলমান সময়টিকে 6 মিনিট থেকে 1 সেকেন্ডে নেমেছে! আমি হ্যাশগুলি সূক্ষ্ম বুঝতে পারি, তবে তালিকার কোনও নাম সন্ধানের সময় কী কী অনুসন্ধানে আলগো ব্যবহৃত হয় তা নিশ্চিত করতে পারেন? এই মাত্র নামের সাথে তালিকার মাধ্যমে পুনরাবৃত্তি? আমি ঠিক বুঝতে চাইছি কেন তালিকা এত ধীর, পাশাপাশি হ্যাশগুলি কেন প্রচুর সংখ্যক কীগুলির জন্য এত দ্রুত?
ফিল

@ ভনজডি আমি আর-তে অভিধান ব্যবহার করার চেষ্টা করছি এবং এই প্রয়োগটি পেয়েছি। যাইহোক, প্রতিটি মান কী সংযোজন করার সময় কী এটি কার্যকর হয়? তুমাকে অগ্রিম ধন্যবাদ.
সাবি

@ শানা: আপনি ঠিক কী বোঝাতে চেয়েছেন তার উদাহরণ দিতে পারেন?
ভোনজড

9

প্যাকেজ হ্যাশ এখন উপলব্ধ: 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"

আপনি কীভাবে একাধিক মান যুক্ত করতে পারেন? আমি কীটি পুনরাবৃত্তি করার চেষ্টা করেছি তবে এটি কেবল সর্বশেষ মানটি সঞ্চয় করে। আমি তালিকাও বরাদ্দ করার চেষ্টা করেছি কিন্তু এটি কার্যকর হয় না
18:25 এ স্ক্যান করুন

অভিধানগুলি কী প্রতি একাধিক মান সংরক্ষণ করে না। আপনি চাইলে একটি কীতে একটি তালিকা বরাদ্দ করতে পারেন।
বলপয়েন্টবেন

7

ডার্কের উত্তরের সংক্ষিপ্ত প্রকরণ:

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

4

আমি কেবলমাত্র মন্তব্য করব আপনি 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)])
সমৃদ্ধ স্ক্রিভেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.