উত্তর:
এই জাতীয় প্রশ্নের উত্তর দেওয়ার জন্য আর ল্যাঙ্গুয়েজ সংজ্ঞা কার্যকর:
আর এর তিনটি বেসিক ইনডেক্সিং অপারেটর রয়েছে, যা সিনট্যাক্স সহ নিম্নলিখিত উদাহরণগুলি দ্বারা প্রদর্শিত হয়
x[i] x[i, j] x[[i]] x[[i, j]] x$a x$"a"
ভেক্টর এবং ম্যাট্রিক্সের জন্য
[[
ফর্মগুলি খুব কমই ব্যবহৃত হয়, যদিও ফর্মের মধ্যে তাদের কিছুটা অর্থগত পার্থক্য রয়েছে[
(যেমন এটি কোনও নাম বা ডিমামের বৈশিষ্ট্যকে বাদ দেয় এবং অক্ষরের সূচকগুলির জন্য আংশিক মিলটি ব্যবহৃত হয়)। যখন কোনও একক সূচকের সাথে বহুমাত্রিক কাঠামোকে সূচীকরণ করা হয়x[[i]]
বাx[i]
এরi
ত্রয়োদশ অনুক্রমিক উপাদানটি ফেরত পাঠায়x
।তালিকাগুলির জন্য, একটি সাধারণত
[[
কোনও একক উপাদান নির্বাচন করতে ব্যবহার করে, যেখানে[
নির্বাচিত উপাদানগুলির একটি তালিকা প্রদান করে।
[[
ফর্ম, শুধুমাত্র একটি একক উপাদান পূর্ণসংখ্যা বা অক্ষর সূচকের ব্যবহার নির্বাচিত হতে দেয় যেহেতু[
ভেক্টর দ্বারা ইন্ডেক্স পারেন। উল্লেখ্য যে তালিকার জন্য, সূচকটি একটি ভেক্টর হতে পারে এবং ভেক্টরের প্রতিটি উপাদান তালিকার পরিবর্তে প্রয়োগ করা হয়, নির্বাচিত উপাদান, সেই উপাদানটির নির্বাচিত উপাদান, এবং আরও কিছু। ফলাফল এখনও একটি একক উপাদান।
[
সবসময় একটি তালিকা উপায়ে যে আপনার জন্য একই আউটপুট বর্গ পেতে আসতে x[v]
দৈর্ঘ্য নির্বিশেষে v
। উদাহরণস্বরূপ, এক চাইতে পারেন lapply
একটি তালিকা একটি উপসেট ওপরে lapply(x[v], fun)
। যদি [
দৈর্ঘ্যের একের ভেক্টরগুলির জন্য তালিকাটি ফেলে দেয় তবে যখনই v
দৈর্ঘ্য এক হবে তখন এটি একটি ত্রুটি ফিরে আসবে ।
দুটি পদ্ধতির মধ্যে উল্লেখযোগ্য পার্থক্য হ'ল নিষ্কাশন করার জন্য ব্যবহৃত বস্তুগুলি তারা ফিরে আসে এবং নির্ধারণের সময় তারা বিভিন্ন মানের মান গ্রহণ করতে পারে, বা কেবলমাত্র একটি একক মান।
নিম্নলিখিত তালিকায় ডেটা উত্তোলনের ক্ষেত্রে বিবেচনা করুন:
foo <- list( str='R', vec=c(1,2,3), bool=TRUE )
বলুন আমরা foo থেকে bool দ্বারা সঞ্চিত মানটি বের করতে এবং একটি if()
বিবৃতিতে এটি ব্যবহার করতে চাই । এটি কখনই ডেটা উত্তোলনের জন্য ব্যবহৃত হয় []
এবং এর রিটার্ন মানগুলির মধ্যে পার্থক্য চিত্রিত করবে [[]]
। []
বর্গ তালিকার পদ্ধতি আয় বস্তু (বা data.frame foo বিন্যাস একটি data.frame ছিল না) যখন [[]]
পদ্ধতি আয় বস্তু যার বর্গ তাদের মান ধরণ দ্বারা নির্ধারিত হয়।
সুতরাং, []
পদ্ধতিটি ব্যবহারের ফলে ফলাফলগুলি নিম্নলিখিত:
if( foo[ 'bool' ] ){ print("Hi!") }
Error in if (foo["bool"]) { : argument is not interpretable as logical
class( foo[ 'bool' ] )
[1] "list"
এর কারণ হল যে []
পদ্ধতিটি একটি তালিকা ফিরিয়ে দিয়েছে এবং একটি তালিকা সরাসরি কোনও if()
বিবৃতিতে পাস করার জন্য বৈধ অবজেক্ট নয় । এই ক্ষেত্রে আমাদের ব্যবহার করা প্রয়োজন [[]]
কারণ এটি "বুল" এ সঞ্চিত "বেয়ার" অবজেক্টটি ফিরিয়ে দেবে যার উপযুক্ত বর্গ থাকবে:
if( foo[[ 'bool' ]] ){ print("Hi!") }
[1] "Hi!"
class( foo[[ 'bool' ]] )
[1] "logical"
দ্বিতীয় পার্থক্য যে []
অপারেটর একটি অ্যাক্সেস করতে ব্যবহার করা যেতে পারে পরিসীমা একটি ডাটা ফ্রেমে একটি তালিকাতে স্লট বা কলামের যখন [[]]
অপারেটর একটি অ্যাক্সেস সীমাবদ্ধ একক স্লট বা কলাম। দ্বিতীয় তালিকা ব্যবহার করে মান নির্ধারণের ক্ষেত্রে বিবেচনা করুন bar()
:
bar <- list( mat=matrix(0,nrow=2,ncol=2), rand=rnorm(1) )
বলুন আমরা বারে থাকা ডেটা দিয়ে ফু-র শেষ দুটি স্লট ওভাররাইট করতে চাই। আমরা যদি [[]]
অপারেটরটি ব্যবহার করার চেষ্টা করি তবে এটিই ঘটে:
foo[[ 2:3 ]] <- bar
Error in foo[[2:3]] <- bar :
more elements supplied than there are to replace
এটি কারণ [[]]
একটি একক উপাদান অ্যাক্সেস সীমাবদ্ধ। আমাদের ব্যবহার করা দরকার []
:
foo[ 2:3 ] <- bar
print( foo )
$str
[1] "R"
$vec
[,1] [,2]
[1,] 0 0
[2,] 0 0
$bool
[1] -0.6291121
নোট করুন যে অ্যাসাইনমেন্টটি সফল হওয়ার সময়, ফুতে স্লটগুলি তাদের আসল নাম রেখেছিল।
ডাবল বন্ধনী তালিকা উপাদান অ্যাক্সেস করে , যখন একটি একক বন্ধনী আপনাকে একক উপাদান সহ একটি তালিকা ফিরিয়ে দেয়।
lst <- list('one','two','three')
a <- lst[1]
class(a)
## returns "list"
a <- lst[[1]]
class(a)
## returns "character"
[]
একটি তালিকা [[]]
নিষ্কাশন করে, তালিকার মধ্যে উপাদানগুলি বের করে
alist <- list(c("a", "b", "c"), c(1,2,3,4), c(8e6, 5.2e9, -9.3e7))
str(alist[[1]])
chr [1:3] "a" "b" "c"
str(alist[1])
List of 1
$ : chr [1:3] "a" "b" "c"
str(alist[[1]][1])
chr "a"
এখানে পুনরায় সংযোজন সূচক[[
জন্য সজ্জিত যে এখানে যোগ করুন ।
এটি জিজোম্যাটহেজে উত্তরে ইঙ্গিত দেওয়া হয়েছিল কিন্তু অন্বেষণ করা হয়নি।
যেমন উল্লিখিত হয়েছে ?"[["
, সিনট্যাক্সের মতো x[[y]]
, যেখানে length(y) > 1
, তা ব্যাখ্যা করা হয়েছে:
x[[ y[1] ]][[ y[2] ]][[ y[3] ]] ... [[ y[length(y)] ]]
দ্রষ্টব্য যে এটির মধ্যে - [
এবং এর মধ্যে পার্থক্যের ক্ষেত্রে আপনার প্রধান গ্রহণযোগ্য কী হওয়া উচিত তা পরিবর্তন করে না[[
যে পূর্ববর্তীটি সাবসেটিংয়ের জন্য ব্যবহৃত হয় এবং পরবর্তীকটি একক তালিকা উপাদানগুলি বের করার জন্য ব্যবহৃত হয় ।
উদাহরণ স্বরূপ,
x <- list(list(list(1), 2), list(list(list(3), 4), 5), 6)
x
# [[1]]
# [[1]][[1]]
# [[1]][[1]][[1]]
# [1] 1
#
# [[1]][[2]]
# [1] 2
#
# [[2]]
# [[2]][[1]]
# [[2]][[1]][[1]]
# [[2]][[1]][[1]][[1]]
# [1] 3
#
# [[2]][[1]][[2]]
# [1] 4
#
# [[2]][[2]]
# [1] 5
#
# [[3]]
# [1] 6
মান 3 পেতে, আমরা এটি করতে পারি:
x[[c(2, 1, 1, 1)]]
# [1] 3
উপরে @ জিজো ম্যাথিউয়ের উত্তর ফিরে পাওয়া, মনে আছে r
:
r <- list(1:10, foo=1, far=2)
বিশেষত, এটি ভুল ব্যবহার করার সময় আমরা যে ত্রুটিগুলি পেতে পারি তা ব্যাখ্যা করে [[
, যথা:
r[[1:3]]
ত্রুটি
r[[1:3]]
: পুনরাবৃত্তির সূচক 2 স্তরে ব্যর্থ হয়েছে
যেহেতু এই কোডটি মূলত মূল্যায়ন করার চেষ্টা করেছে r[[1]][[2]][[3]]
এবং r
একের স্তরে বাসা বাঁধছে , তাই পুনরাবৃত্তিমূলক সূচকের মাধ্যমে আহরণের প্রচেষ্টা ব্যর্থ হয়েছিল [[2]]
, অর্থাৎ স্তরের ২ তে failed
ত্রুটি এতে
r[[c("foo", "far")]]
: সাবস্ক্রিপ্ট সীমার বাইরে
এখানে, আর সন্ধান করছিল r[["foo"]][["far"]]
, যা বিদ্যমান নেই, সুতরাং আমরা সাবস্ক্রিপ্টটি সীমা ত্রুটির বাইরে পেয়েছি।
যদি এই উভয় ত্রুটি একই বার্তা দেয় তবে সম্ভবত এটি আরও কিছুটা সহায়ক / সামঞ্জস্যপূর্ণ হবে।
উভয়ই সাবসেট করার উপায়। একক বন্ধনী তালিকার একটি উপসেট ফিরিয়ে দেবে, যা নিজেই একটি তালিকা হবে। অর্থাত: এটিতে একের বেশি উপাদান থাকতে পারে বা নাও থাকতে পারে। অন্যদিকে একটি ডাবল বন্ধনী তালিকা থেকে কেবলমাত্র একক উপাদানকে ফিরিয়ে দেবে।
-সেইঙ্গেল ব্র্যাকেট আমাদের একটি তালিকা দেবে। আমরা যদি তালিকা থেকে একাধিক উপাদান ফেরত করতে চাই তবে আমরা একক বন্ধনীও ব্যবহার করতে পারি। নিম্নলিখিত তালিকা বিবেচনা করুন: -
>r<-list(c(1:10),foo=1,far=2);
আমি দয়া করে তালিকাটি প্রদর্শন করার চেষ্টা করার পরে তালিকাটি কীভাবে ফিরে আসবে তা দয়া করে নোট করুন। আমি আর টাইপ করে এন্টার টিপুন
>r
#the result is:-
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
$foo
[1] 1
$far
[1] 2
এখন আমরা একক বন্ধনী এর যাদু দেখতে পাবেন: -
>r[c(1,2,3)]
#the above command will return a list with all three elements of the actual list r as below
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
$foo
[1] 1
$far
[1] 2
যা ঠিক তখনই যখন আমরা স্ক্রিনে আর এর মান প্রদর্শন করার চেষ্টা করেছি, যার অর্থ একক বন্ধনী ব্যবহারের ফলে একটি তালিকা ফিরে এসেছে, যেখানে সূচি 1 এ আমাদের 10 টি উপাদান রয়েছে, তারপরে আমাদের আরও দুটি উপাদান রয়েছে নামগুলি সহ foo এবং দূরে। আমরা একক ব্র্যাকেটে ইনপুট হিসাবে কোনও একক সূচক বা উপাদানটির নামও চয়ন করতে পারি। উদাহরণ:
> r[1]
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
এই উদাহরণে আমরা একটি সূচক "1" দিয়েছি এবং বিনিময়ে একটি উপাদান সহ একটি তালিকা পেয়েছি (যা 10 সংখ্যার অ্যারে)
> r[2]
$foo
[1] 1
উপরের উদাহরণে আমরা একটি সূচক "2" দিয়েছি এবং বিনিময়ে একটি উপাদান সহ একটি তালিকা পেয়েছি
> r["foo"];
$foo
[1] 1
এই উদাহরণে আমরা একটি উপাদানটির নামটি দিয়েছি এবং বিনিময়ে একটি উপাদান দিয়ে একটি তালিকা ফিরে এসেছে।
আপনি উপাদানগুলির নামেরগুলির মতো একটি ভেক্টরও পাস করতে পারেন: -
> x<-c("foo","far")
> r[x];
$foo
[1] 1
$far
[1] 2
এই উদাহরণে আমরা "foo" এবং "দূরে" দুটি উপাদান নাম সহ একটি ভেক্টর পাস করেছি
বিনিময়ে আমরা দুটি উপাদান সহ একটি তালিকা পেয়েছি।
সংক্ষিপ্ত একক বন্ধনী সর্বদা আপনাকে উপাদানগুলির সংখ্যার সমান পরিমাণ বা সূচিগুলির সংখ্যার সমতুল্য উপাদানগুলির একটি অন্য তালিকা আপনাকে একক ব্র্যাকেটে প্রদান করবে।
বিপরীতে, একটি ডাবল বন্ধনী সর্বদা কেবলমাত্র একটি উপাদান ফিরে আসবে। ডাবল ব্র্যাকেটে যাওয়ার আগে একটি নোট মনে রাখবেন।
NOTE:THE MAJOR DIFFERENCE BETWEEN THE TWO IS THAT SINGLE BRACKET RETURNS YOU A LIST WITH AS MANY ELEMENTS AS YOU WISH WHILE A DOUBLE BRACKET WILL NEVER RETURN A LIST. RATHER A DOUBLE BRACKET WILL RETURN ONLY A SINGLE ELEMENT FROM THE LIST.
আমি কয়েকটি উদাহরণ সাইট করব। দয়া করে সাহসের সাথে শব্দের একটি নোট রাখুন এবং নীচের উদাহরণগুলির সাথে কাজটি শেষ করার পরে এটিতে ফিরে আসুন:
ডাবল বন্ধনী আপনাকে সূচীতে আসল মানটি ফিরিয়ে দেবে ((এটি কোনও তালিকা ফেরত দেবে না )
> r[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
>r[["foo"]]
[1] 1
ডাবল বন্ধনীগুলির জন্য যদি আমরা কোনও ভেক্টর পাস করে একাধিক উপাদান দেখার চেষ্টা করি তবে এটি একটি ত্রুটির কারণ হতে পারে কারণ এটি প্রয়োজনীয়তা পূরণের জন্য নির্মিত হয়নি, তবে কেবল একটি একক উপাদান ফিরে ফেরাতে।
নিম্নোক্ত বিবেচনা কর
> r[[c(1:3)]]
Error in r[[c(1:3)]] : recursive indexing failed at level 2
> r[[c(1,2,3)]]
Error in r[[c(1, 2, 3)]] : recursive indexing failed at level 2
> r[[c("foo","far")]]
Error in r[[c("foo", "far")]] : subscript out of bounds
ম্যানুয়াল কুয়াশার মাধ্যমে নব্যবাইজদের নেভিগেট করতে সহায়তা করতে, [[ ... ]]
স্বরলিপিটি একটি ক্রপিং ফাংশন হিসাবে দেখানো সহায়ক হতে পারে - অন্য কথায়, আপনি যখন নামকরণ করা ভেক্টর, তালিকা বা ডেটা ফ্রেম থেকে কেবল 'ডেটা পেতে' চান want আপনি যদি গণনার জন্য এই বিষয়গুলি থেকে ডেটা ব্যবহার করতে চান তবে এটি করা ভাল। এই সহজ উদাহরণগুলি ব্যাখ্যা করবে।
(x <- c(x=1, y=2)); x[1]; x[[1]]
(x <- list(x=1, y=2, z=3)); x[1]; x[[1]]
(x <- data.frame(x=1, y=2, z=3)); x[1]; x[[1]]
তৃতীয় উদাহরণ থেকে:
> 2 * x[1]
x
1 2
> 2 * x[[1]]
[1] 2
টার্মিনোলজিকাল হওয়ায় [[
অপারেটর একটি তালিকা থেকে উপাদানটি বের করে , অপারেটর তালিকার সাবসেট[
নেয় ।
আর একটি কংক্রিট ব্যবহারের ক্ষেত্রে, আপনি যখন split()
ফাংশন দ্বারা তৈরি একটি ডেটা ফ্রেম নির্বাচন করতে চান তখন ডাবল বন্ধনী ব্যবহার করুন । যদি আপনি না জানেন তবে split()
কী ক্ষেত্রের উপর ভিত্তি করে একটি তালিকা / ডেটা ফ্রেমকে সাবটায় বিভক্ত করুন। আপনি যখন একাধিক গ্রুপে পরিচালনা করতে চান, তাদের প্লট করবেন ইত্যাদি কার্যকর হয় It's
> class(data)
[1] "data.frame"
> dsplit<-split(data, data$id)
> class(dsplit)
[1] "list"
> class(dsplit['ID-1'])
[1] "list"
> class(dsplit[['ID-1']])
[1] "data.frame"
নীচের-বিস্তারিত ব্যাখ্যা দেখুন।
আমি আর্টে বিল্ট-ইন ডেটা ফ্রেম ব্যবহার করেছি, তাকে এমটিকার্স বলে।
> mtcars
mpg cyl disp hp drat wt ...
Mazda RX4 21.0 6 160 110 3.90 2.62 ...
Mazda RX4 Wag 21.0 6 160 110 3.90 2.88 ...
Datsun 710 22.8 4 108 93 3.85 2.32 ...
............
টেবিলের শীর্ষ রেখাটিকে শিরোনাম বলা হয় যা কলামের নামগুলি অন্তর্ভুক্ত করে। পরবর্তী প্রতিটি অনুভূমিক রেখা একটি ডেটা সারি চিহ্নিত করে যা সারিটির নাম দিয়ে শুরু হয় এবং তারপরে প্রকৃত ডেটা অনুসরণ করে। একটি সারির প্রতিটি ডাটা সদস্যকে একটি ঘর বলা হয়।
একটি কক্ষে ডেটা পুনরুদ্ধার করতে, আমরা এর সারি এবং কলাম স্থানাঙ্কগুলি একক বর্গাকার বন্ধনী "[]" অপারেটরে প্রবেশ করতাম। দুটি সমন্বয়ক কমা দ্বারা পৃথক করা হয়। অন্য কথায়, স্থানাঙ্কগুলি সারি অবস্থানের সাথে শুরু হয়, তারপরে কমা দ্বারা অনুসরণ করা হয় এবং কলামের অবস্থানের সাথে শেষ হয়। আদেশ গুরুত্বপূর্ণ।
উদাহরণস্বরূপ 1: - এখানে প্রথম সারির ম্যাটকার্সের দ্বিতীয় কলামের ঘর মান is
> mtcars[1, 2]
[1] 6
উদাহরণস্বরূপ 2: - তদতিরিক্ত, আমরা সংখ্যার স্থানাঙ্কের পরিবর্তে সারি এবং কলামের নামগুলি ব্যবহার করতে পারি।
> mtcars["Mazda RX4", "cyl"]
[1] 6
আমরা ডাবল বর্গাকার বন্ধনী "[[]]" অপারেটরের সাথে একটি ডেটা ফ্রেম কলাম উল্লেখ করি।
উদাহরণস্বরূপ 1: - অন্তর্নির্মিত ডেটা সেট এমটিকার্সের নবম কলাম ভেক্টরটি পুনরুদ্ধার করতে, আমরা এমটিকারস লিখি [[9]]।
এমটিকার্স [[9]] [1] 1 1 1 0 0 0 0 0 0 0 0 0 ...
উদাহরণস্বরূপ 2: - আমরা একই কলামের ভেক্টর এর নাম অনুসারে পুনরুদ্ধার করতে পারি।
এমটিকার্স [["am"]] [1] 1 1 1 0 0 0 0 0 0 0 0 0 ...