5. ডেটার ধরনসমূহ (Data Types)

আমরা প্রায়ই দোকানে গিয়ে বলি, "পাচ কেজি ডাল দেন"। আবার হুটহাট করে বন্ধুকে জিজ্ঞাসা করি, "দোস্ত, কয়টা বাজে?" । আবার টিচাররা বকা দেবার সময় বলেন, "মিথ্যা বলবেনা খবরদার!"

আমি এতক্ষন যা বললাম সবই হচ্ছে বিভিন্নরকম ডেটার উদাহরণ। এরকম আমরা আমাদের জীবনের প্রতিটি মুহুর্তে ডেটার ব্যাবহার করেই চলেছি। এর আগের অধ্যায়ে জেনেছি যে ভেরিয়েবল ব্যাবহার করা হয় বিভিন্ন ভ্যালু বা ডেটা স্টোর করে রাখার জন্যে। আজকে আমরা এইসব ভ্যালু বা ডেটার ধরন নিয়ে কথা বলবো। যেমনঃ উপরের উদাহরণে "পাচ" কেজি ডাল কথাটার মধ্যে একটা সংখ্যা আছে। বন্ধু যখন বলে "এখন সাড়ে তিনটা বাজে" এখানেও একটা ডেটা আছে। উপরোক্ত টিচারের কথায় "মিথ্যা" শব্দটিও একটি ডাটা। আমাদের চারপাশের এই হরেক রকম ডেটা নিয়ে কাজ করার জন্যে আমরা এগুলোকে কয়েকটা সুবিধামত ক্যাটাগরীতে ভাগ করে নিয়েছি। যেমনঃ পূর্ন সংখ্যা, সময়, দশমিক সংখ্যা ইত্যাদি। এই ভাগ গুলোকেই বলা হয় ডেটা টাইপস। R প্রোগ্রামিং ভাষায়ও এরকম কয়েকটি ক্যাটাগরি আছে। আমরা এখন সেগুলো দেখবো। তার আগে আমাদের জানা উচিৎ কোনো ডেটার ধরন কিভাবে চেক করতে হয়।

> x<- 61
> class(x)
[1] "numeric"
> y<- "tuhin"
> class(y)
[1] "character"

কোনো ভ্যারিয়েবলে কি টাইপের ডেটা আছে তা জানার জন্যে আমরা class() ফাংশন ব্যাবহার করি। যেমন আমাদের এখানে x হচ্ছে নিউমেরিক টাইপ এবং y হচ্ছে ক্যারেকটার টাইপ। এই ক্যারেকটার টাইপকেই স্ট্রিং বলা হয়। ডেটার ধরন বুঝার জন্যে আরো কয়েকটি নিয়ম আছে যেমনঃ

> typeof(y)
[1] "character"

এখানে y ভেরিয়েবলে আমি রেখেছিলাম "tuhin" যেটি কিনা একটি ক্যারেকটার টাইপের ডেটা। যা আমরা একটু আগেই দেখলাম class() ফাংশন দিয়ে। এখন typeof(y) লিখে এন্টার প্রেস করেও আমরা একই আউটপুট পাচ্ছি। যদিও typeof() ব্যাবহার করে আমরা আরেকটু ভালো ডিটেইলস আউটপুট পাই। সেটা এই ক্যারেকটার ভ্যারিয়েবলে বোঝা না গেলেও সংখ্যার বেলায় ঠিকই বোঝা যায়। যেমনঃ

> x<- 61
> typeof(x)
[1] "double"

আউটপুট এসেছে "double" এটি নিশ্চয় তোমাদের পরিচিত নয়। এই ডাবল কথার অর্থ হচ্ছে সংখ্যাটির পরে দশমিকের পরে ছয়ঘর পর্যন্ত আছে। কিন্তু আমরা তো এখানে কোনো দশমিকই দেইনি, তাহলে এমন হবে কেন? এই প্রশ্ন তোমরা করতেই পারো। তার উত্তরটা হচ্ছে, কোনো কোনো কম্পিউটারে R সমস্ত সঙ্গখ্যাগুলোকে ডাবল বা দশমিক হিসেবে বিবেচনা করে নেয় নিজে থেকেই, যদিনা আমরা তাকে কোনো টাইপ না বলে দেই। তোমার কম্পিউটার হয়তো এটাকে নিজে থেকেই পূর্ণ সঙ্গখ্যা বা integer হিসেবে বিবেচনা করতে পারে। এগুলা নির্ভর করে কম্পিউটার আর্কিটেকচারের উপর। সেসব আমাদের মাথাব্যাথার বিষয় নয়। এখন আমি আমার কম্পিউতারকে বলেই দিবো যে, এই সংখ্যাটি দশমিক নয়, এটি একটি পূর্ণ সঙ্গখ্যা। এই কাজটি করতে পারি এভাবে,

> x<- as.integer(61)
> typeof(x)
[1] "integer"

as.integer() ফাংশন দিয়ে আমরা ডাবল ডেটা টাইপকে ইন্টিজার বানিয়ে ফেললাম। এভাবে চাইলেই যেকোনো টাইপে কনভার্ট করা যায় as.character(), as.double(), as.numeric() ইত্যাদি ফাংশন ব্যাবহার করে আমরা সহজেই এক টাইপ থেকে অন্য টাইপে যেতে পারি। তোমরা নিজেরা ট্রাই করে দেখতে পারো।

এছারাও আমরা আরেকভাবে ডেটা টাইপ চেক করতে পারি,

> is.integer(x)
[1] TRUE

আউটপুট এসেছে TRUE যার অর্থ হচ্ছে এই ভেরিয়েবলটি ইন্টিজার টাইপের। যদি অন্যভাবে ট্রাই করি? তাহলে কি হবে?

> is.character(x)
[1] FALSE

এবারে আউটপুট এসেছে FALSE যার অর্থ হলো এই ডেটা টি ক্যারেক্টার টাইপের না। আশাকরি বুঝাতে পেরেছি। এবারে দেখে নেয়া যাক R এ কি কি টাইপ আছে।

Logical
> x<- TRUE
> class(x)
[1] "logical"

TRUE এবং FALSE এই দুই টাইপকে বলা হয় লজিক্যাল বা বুলিয়ান টাইপ। এই ট্রু আর ফলস ছাড়া এর অন্যকোনো ভ্যালু নেই।

Numeric
> x<- 23.5
> class(x)
[1] "numeric"

10, 12, 134 যত সংখ্যা আছে সবই নিউমেরিক টাইপের ডেটা হিসেবে বিবেচিত হবে।

Integer
> x<- as.integer(23.5)
> class(x)
[1] "integer"

যদি সেই সংখ্যাগুলো পূর্ণসংখ্যা হয় তাহলে তাকে আমরা বলবো ইন্টিজার। যেমন এখন আমি 23.5 কে ইন্টিজার বানিয়ে দিয়েছি, তারমানে দশমিকের পরের অংশ বাদ পরে গেছে। বিশ্বাস না হলে x লিখে এন্টার প্রেস করেই দেখো।

Complex Number
> x<- 5+6i
> class(x)
[1] "complex"

জটিল সংখ্যা নিয়ে কাজ করার জন্যে complex টাইপ ব্যাবহার করা হয়। সমস্ত জটিল সংখ্যা এই টাইপের অন্তর্ভুক্ত হবে।

Character
> x<- "How are you?"
> class(x)
[1] "character"

অক্ষর, চিহ্ন, সংখ্যা, এসব মিলিয়েই তৈরি হয় ক্যারেক্টার টাইপ ডেটা। কিন্তু শর্ত হলো এগুলো একটা " " কোটেশনের ভেতর থাকতে হবে। কোটেশনের ভিতর যাই ই থাকুক না কেন, তাই ই ক্যারেক্টার হয়ে যাবে। আই রিপিট, যাই ই থাকুক না কেন।

Raw Type
> x<- charToRaw("Hello")
> x
[1] 48 65 6c 6c 6f
> class(x)
[1] "raw"

এখন আমরা যদি এই অক্ষরগুলোকে আমরা হেক্সাডেসিমেল এ কনভার্ট করে নিই তাহলে সেটাকে Raw টাইপ বলা হবে। আমরা এখানে "Hello" কথাটিকে হেক্সাডেসিমে এ কনভার্ট করেছি charToRaw() ফাংশনের সাহায্যে। তারপর সেটার টাইপ চেক করে দেখলাম। দ্যাটস ইট! আশাকরি বুঝাতে পেরেছি।

এগুলো হচ্ছে বহুল ব্যাবহৃত ডেটা টাইপ। এর বাইরে আর কোনো টাইপের ব্যাবহার নেই বললেই চলে। তবে Date and times কে আলাদা টাইপ হিসেবে বিবেচনা করা যায়। এবং ডেট এন্ড টাইম নিয়ে কাজ করার জন্যে বিশেষ ফাংশন রয়েছে। তাই আমরা ডেট এন্ড টাইমকে এখানে আলোচনা না করে, আলাদাভাবে আলোচনা করবো।