কখন একটি ব্যবহার করা উচিত data.frame
এবং কখন এটি ব্যবহার করা ভাল matrix
?
উভয়ই আয়তক্ষেত্রাকার বিন্যাসে ডেটা রাখে, তাই কখনও কখনও এটি অস্পষ্ট।
কোন ডাটা টাইপটি কখন ব্যবহার করতে হবে তার জন্য কি কোনও সাধারণ নিয়ম রয়েছে?
কখন একটি ব্যবহার করা উচিত data.frame
এবং কখন এটি ব্যবহার করা ভাল matrix
?
উভয়ই আয়তক্ষেত্রাকার বিন্যাসে ডেটা রাখে, তাই কখনও কখনও এটি অস্পষ্ট।
কোন ডাটা টাইপটি কখন ব্যবহার করতে হবে তার জন্য কি কোনও সাধারণ নিয়ম রয়েছে?
উত্তর:
উত্তরের অংশটি ইতিমধ্যে আপনার প্রশ্নের মধ্যে রয়েছে: কলাম (ভেরিয়েবল) বিভিন্ন ধরণের (সংখ্যাসূচক / চরিত্র / যৌক্তিক ইত্যাদি) হতে পারে এমন প্রত্যাশা করা গেলে আপনি ডেটা ফ্রেম ব্যবহার করেন। ম্যাট্রিকগুলি একই ধরণের ডেটার জন্য।
ফলস্বরূপ, পছন্দের ম্যাট্রিক্স / ডেটা ফ্রেম কেবলমাত্র সমস্যাযুক্ত যদি আপনার কাছে একই ধরণের ডেটা থাকে।
উত্তরটি ডাটা.ফ্রেম / ম্যাট্রিক্সের ডেটা দিয়ে আপনি কী করতে যাচ্ছেন তার উপর নির্ভর করে। যদি এটি অন্য ফাংশনে স্থানান্তরিত হতে চলেছে তবে এই ফাংশনগুলির আর্গুমেন্টগুলির প্রত্যাশিত ধরণের পছন্দটি নির্ধারণ করে।
এছাড়াও:
ম্যাট্রিকগুলি আরও মেমরি দক্ষ:
m = matrix(1:4, 2, 2)
d = as.data.frame(m)
object.size(m)
# 216 bytes
object.size(d)
# 792 bytes
আপনি যদি কোনও লিনিয়ার বীজগণিত-ধরণের অপারেশন করার পরিকল্পনা করেন তবে ম্যাট্রিকগুলি একটি প্রয়োজনীয়তা।
যদি আপনি প্রায়শই নামগুলি (কমপ্যাক্ট $ অপারেটরের মাধ্যমে) এর কলামগুলি উল্লেখ করেন তবে ডেটা ফ্রেমগুলি আরও সুবিধাজনক।
আপনি প্রতিটি কলামে আলাদা আলাদাভাবে ফর্ম্যাটিং প্রয়োগ করতে পারেন তাই তথ্য ফ্রেমগুলি ট্যাবুলার সম্পর্কিত তথ্য (মুদ্রণ) প্রতিবেদনের জন্যও আইএমএইচও ভাল।
@ মিচালের দ্বারা উল্লিখিত কিছু না হ'ল সমতুল্য ডেটা ফ্রেমের চেয়ে ম্যাট্রিক্স কেবল ছোট নয়, ম্যাট্রিকগুলি ব্যবহার করা আপনার কোড ডেটা ফ্রেম ব্যবহারের চেয়ে অনেক বেশি দক্ষ করে তুলতে পারে, প্রায়শই যথেষ্ট। এটি অভ্যন্তরীণভাবেই একটি কারণ, প্রচুর পরিমাণে ফাংশন ডেটা ফ্রেমে থাকা ম্যাট্রিক্স ডেটাতে বাধ্য করে।
ডেটা ফ্রেম প্রায়শই অনেক বেশি সুবিধাজনক হয়; একজনের কাছে সর্বদা ডেটা কেবলমাত্র পারমাণবিক অংশ থাকে না।
নোট করুন যে আপনার একটি অক্ষর ম্যাট্রিক্স থাকতে পারে; আর-তে একটি ম্যাট্রিক্স তৈরি করতে আপনার কাছে কেবলমাত্র ডেটা রাখতে হবে না।
ডেটা ফ্রেমকে ম্যাট্রিক্সে রূপান্তর করার সময় মনে রাখবেন একটি data.matrix()
ফাংশন রয়েছে যা অভ্যন্তরীণ স্তরের উপর ভিত্তি করে সংখ্যাসূচক মানেরগুলিতে রূপান্তর করে কারণগুলিকে যথাযথভাবে পরিচালনা করে। as.matrix()
যদি ফ্যাক্টর লেবেলগুলির কোনও অ-সংখ্যাসূচক হয় তবে এর মাধ্যমে কুর্সিংয়ের ফলে একটি অক্ষর ম্যাট্রিক্স হবে। তুলনা করা:
> head(as.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
a B
[1,] "a" "A"
[2,] "b" "B"
[3,] "c" "C"
[4,] "d" "D"
[5,] "e" "E"
[6,] "f" "F"
> head(data.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
a B
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
আমি প্রায়শই আমার ডেটা বিশ্লেষণ কার্যগুলির জন্য একটি ডেটা ফ্রেম ব্যবহার করি কারণ আমার প্রায়শই কেবল সংখ্যাগত ভেরিয়েবলের চেয়ে বেশি থাকে। আমি যখন প্যাকেজগুলির জন্য ফাংশনগুলি কোড করি, আমি প্রায়শই ম্যাট্রিক্সে বাধ্য করি এবং তারপরে ফলাফলগুলি ডেটা ফ্রেম হিসাবে ফর্ম্যাট করি। এটি কারণ ডেটা ফ্রেম সুবিধাজনক।
@ মিচাল: ম্যাট্রিকগুলি আসলে বেশি স্মৃতিশক্তি দক্ষ নয়:
m <- matrix(1:400000, 200000, 2)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 1600776 bytes
... যদি না আপনার কাছে প্রচুর পরিমাণে কলাম থাকে:
m <- matrix(1:400000, 2, 200000)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 22400568 bytes
data.frames
কলামের ধরণের উপর আরও নমনীয়তার প্রস্তাব দেয়। ধরণের জবরদস্তির কারণে সংস্করণটির data.frame(a = rnorm(1e6), b = sample(letters, 1e6, TRUE))
তুলনায় স্মৃতিতে অনেক ছোট (আমার দ্রুত গণনা দ্বারা 6x) হবে matrix
।
ম্যাট্রিক্স আসলে অতিরিক্ত পদ্ধতি সহ ভেক্টর। যখন ডেটা.ফ্রেম একটি তালিকা। পার্থক্যটি ভেক্টর বনাম তালিকার নিচে। গণনার দক্ষতার জন্য, ম্যাট্রিক্সের সাথে লেগে থাকুন। আপনার যদি ডেটা ফ্রেম ব্যবহার করে থাকেন।
ম্যাট্রিক্স এবং ডেটা ফ্রেমগুলি আয়তক্ষেত্রাকার 2D অ্যারে এবং সারি এবং কলামগুলির দ্বারা ভিন্ন ভিন্ন হতে পারে । তারা কিছু পদ্ধতি এবং বৈশিষ্ট্য ভাগ করে, তবে সবকটি নয়।
উদাহরণ:
M <- list(3.14,TRUE,5L,c(2,3,5),"dog",1i) # a list
dim(M) <- c(2,3) # set dimensions
print(M) # print result
# [,1] [,2] [,3]
# [1,] 3.14 5 "dog"
# [2,] TRUE Numeric,3 0+1i
DF <- data.frame(M) # a data frame
print(DF) # print result
# X1 X2 X3
# 1 3.14 5 dog
# 2 TRUE 2, 3, 5 0+1i
M <- matrix(c(1,1,1,1,2,3,1,3,6),3) # a numeric matrix
DF <- data.frame(M) # a all numeric data frame
solve(M) # obtains inverse matrix
solve(DF) # obtains inverse matrix
det(M) # obtains determinant
det(DF) # error
দুজনের মধ্যে দক্ষতার পার্থক্যের বিষয়টি আমি আর চাপ দিতে পারি না! যদিও এটি সত্য যে কিছু বিশেষ করে ডেটা বিশ্লেষণের ক্ষেত্রে ডিএফগুলি আরও সুবিধাজনক তবে তারা ভিন্ন ভিন্ন উপাত্তকেও মঞ্জুরি দেয় এবং কিছু গ্রন্থাগার কেবল সেগুলি গ্রহণ করে, যদি আপনি কোনও নির্দিষ্ট কাজের জন্য এক-সময় কোড না লিখে থাকেন তবে এগুলি সমস্তই গৌণ is
আমাকে যদি আপনি একটি উদাহরণ দিতে। এখানে একটি ফাংশন ছিল যা MCMC পদ্ধতির 2D পথ গণনা করবে। মূলত, এর অর্থ আমরা একটি প্রাথমিক বিন্দু (x, y) নিয়েছি এবং প্রতিটি পদক্ষেপে একটি নতুন পয়েন্ট (x, y) সন্ধানের জন্য একটি নির্দিষ্ট অ্যালগরিদম পুনরাবৃত্তি করি, পুরো পথটি এইভাবেই তৈরি করে। অ্যালগরিদমটিতে একটি বেশ জটিল ফাংশন এবং প্রতিটি পুনরাবৃত্তিতে কিছু এলোমেলো পরিবর্তনশীলের গণনা জড়িত থাকে, সুতরাং এটি যখন 12 সেকেন্ড চলবে তখন আমি ভেবেছিলাম যে এটি প্রতিটি পদক্ষেপে কত স্টাফ করে তা ঠিক আছে fine বলা হচ্ছে, ফাংশনটি 3-কলামের ডেটা.ফ্রেমে একটি উদ্দেশ্য ফাংশনের মান সহ নির্মিত পথে সমস্ত পয়েন্ট সংগ্রহ করেছিল। সুতরাং, 3 টি কলামগুলি এতো বড় নয় এবং পদক্ষেপের সংখ্যাটিও যুক্তিসঙ্গত 10,000 এর চেয়ে বেশি ছিল (এই ধরণের সমস্যায় 1,000,000 দৈর্ঘ্যের পাথগুলি সাধারণ, সুতরাং 10,000 কিছুই নয়)। সুতরাং, আমি ভেবেছিলাম একটি ডিএফ 10, 000x3 অবশ্যই কোনও সমস্যা নয়। একটি ডিএফ ব্যবহার করার কারণটি সহজ। ফাংশনটি কল করার পরে, ggplot () কে ফলাফল (x, y) -পথ আঁকতে বলা হয়েছিল। এবং ggplot () কোনও ম্যাট্রিক্স গ্রহণ করে না।
তারপরে, কৌতূহলের বাইরে এক পর্যায়ে আমি ম্যাট্রিক্সে পথ সংগ্রহের জন্য ফাংশনটি পরিবর্তন করার সিদ্ধান্ত নিয়েছি। আনন্দের সাথে ডিএফ এবং ম্যাট্রিক্সের বাক্য গঠনটি একই রকম, আমি যা করলাম তা হ'ল ডেটা হিসাবে ফ্রেম নির্দিষ্ট করে রেখাকে পরিবর্তন করা। ফ্রেমটিকে ম্যাট্রিক্স হিসাবে আরম্ভ করার জন্য to এখানে আমার আরও উল্লেখ করা দরকার যে প্রাথমিক কোডে ডিএফের চূড়ান্ত আকার ধারণ করা হয়েছিল, সুতরাং পরে ফাংশনের কোডটিতে ইতিমধ্যে বরাদ্দ করা জায়গাগুলিতে কেবলমাত্র নতুন মানগুলি রেকর্ড করা হত, এবং সেখানে নতুন সারি যুক্ত করার কোনও ওভারহেড ছিল না ডিএফ। এটি তুলনাটিকে আরও সুষ্ঠু করে তোলে এবং এটি আমার কাজটিকে আরও সহজ করে তোলে কারণ ফাংশনে আমার আর কিছু লেখার দরকার পড়েনি। প্রয়োজনীয় আকারের ডেটা ফ্রেম থেকে একই আকারের একটি ম্যাট্রিক্সে কেবলমাত্র এক লাইন পরিবর্তন। ফাংশনের নতুন সংস্করণটি জিপিপ্লাটে () রূপান্তর করতে, আমি এখনই ফিরে আসা ম্যাট্রিক্সকে একটি ডেটাতে রূপান্তর করেছি।
কোডটি পুনরায় চালু করার পরে আমি ফলাফলটি বিশ্বাস করতে পারি না। কোডটি এক সেকেন্ডের ভগ্নাংশে চলে! প্রায় 12 সেকেন্ডের পরিবর্তে। এবং আবারও, 10,000 পুনরাবৃত্তির সময় ফাংশনটি একটি ডিএফ (এবং এখন একটি ম্যাট্রিক্সে) ইতিমধ্যে বরাদ্দ স্পেসগুলিতে মানগুলি কেবল পঠন করে লিখেছিল। এবং এই পার্থক্যটি যুক্তিসঙ্গত (বা বরং ছোট) আকারের 10000x3 এর জন্যও।
সুতরাং, যদি আপনার ডিএফ ব্যবহারের একমাত্র কারণ হ'ল এটি জিপিপ্লট () এর মতো কোনও লাইব্রেরির ফাংশনটির সাথে সামঞ্জস্যপূর্ণ হয় তবে আপনি সর্বদা শেষ মুহুর্তে এটি একটি ডিএফতে রূপান্তর করতে পারেন - যতটা সুবিধাজনক বোধ করেন ম্যাট্রিকগুলি নিয়ে কাজ করুন। অন্যদিকে যদি ডিএফ ব্যবহারের আরও বেশি যুক্তিসঙ্গত কারণ থাকে যেমন আপনি কিছু তথ্য বিশ্লেষণ প্যাকেজ ব্যবহার করেন যা অন্যথায় ধ্রুবককে ম্যাট্রিক থেকে ডিএফ এবং পিঠে রূপান্তর করতে হয়, বা আপনি নিজে কোনও নিবিড় গণনা করেন না এবং কেবলমাত্র মান ব্যবহার করেন প্যাকেজগুলি (তাদের মধ্যে অনেকেই অভ্যন্তরীণভাবে একটি ম্যাট্রিক্সে একটি ডিএফ রূপান্তর করে, তাদের কাজটি করে, এবং ফলাফলটি পুনরায় রূপান্তর করে - সুতরাং তারা আপনার জন্য সমস্ত দক্ষতা কাজ করে), বা এককালীন কাজ করে যাতে আপনি যত্ন না করেন এবং অনুভব করেন না ডিএফগুলির সাথে আরও আরামদায়ক, তবে আপনার দক্ষতার বিষয়ে চিন্তা করা উচিত নয়।
বা অন্যরকম ব্যবহারিক নিয়ম: আপনার যদি ওপি-তে যেমন প্রশ্ন থাকে তবে ম্যাট্রিক ব্যবহার করুন, সুতরাং আপনার যখন ডিএফ ব্যবহার করা হবে তখনই আপনি যখন এ জাতীয় প্রশ্ন করবেন না (কারণ আপনি ইতিমধ্যে জানেন যে আপনাকে ডিএফ ব্যবহার করতে হবে, বা কারণ আপনি কোডটি এক-সময় ইত্যাদি হিসাবে সত্যই যত্ন নেই)
তবে সাধারণভাবে এই দক্ষতার বিষয়টিটিকে সর্বদা অগ্রাধিকার হিসাবে মনে রাখুন।