কোনও সরল / সরল উত্তর নেই কারণ এই দুটি প্যাকেজের দর্শনগুলি নির্দিষ্ট দিক থেকে পৃথক। সুতরাং কিছু আপস অপরিহার্য। এখানে আপনার উদ্বেগের সমাধান করতে হবে / বিবেচনা করতে হবে।
জড়িত অপারেশনগুলি i
(== filter()
এবং slice()
dplyr এ)
ধরে নিন DT
10 কলাম বলে। এই ডেটা.ট্যাবল এক্সপ্রেশন বিবেচনা করুন:
DT[a > 1, .N]
DT[a > 1, mean(b), by=.(c, d)]
(1) DT
কলামে সারিগুলির সংখ্যা দেয় a > 1
। (২) একই অভিব্যক্তির জন্য (1) হিসাবে mean(b)
গোষ্ঠী অনুসারে c,d
প্রদান করেi
সাধারণত ব্যবহৃত dplyr
এক্সপ্রেশন:
DT %>% filter(a > 1) %>% summarise(n())
DT %>% filter(a > 1) %>% group_by(c, d) %>% summarise(mean(b))
স্পষ্টতই, ডাটা.ট্যাবেল কোডগুলি ছোট। এছাড়াও তারা আরও মেমরি দক্ষ 1 । কেন? কারণ (3) এবং (4) উভয় ক্ষেত্রে প্রথমে সমস্ত 10 টি কলামের সারিfilter()
ফেরত দেয় , যখন (3) এ আমাদের কেবল সারিগুলির সংখ্যা প্রয়োজন এবং (4) এ আমাদের কেবল ধারাবাহিক ক্রিয়াকলাপের জন্য কলামগুলি প্রয়োজন । এটি কাটিয়ে উঠতে, আমাদের কলামগুলি এপ্রিওরি করতে হবে:b, c, d
select()
DT %>% select(a) %>% filter(a > 1) %>% summarise(n())
DT %>% select(a,b,c,d) %>% filter(a > 1) %>% group_by(c,d) %>% summarise(mean(b))
দুটি প্যাকেজের মধ্যে একটি প্রধান দার্শনিক পার্থক্য হাইলাইট করা আবশ্যক:
ইন data.table
, আমরা এই সম্পর্কিত ক্রিয়াকলাপগুলি একসাথে রাখতে চাই এবং এটি j-expression
(একই ফাংশন কল থেকে) দেখতে এবং বুঝতে পারে যে (1) এ কোনও কলামের প্রয়োজন নেই। মধ্যে i
প্রকাশটি গুণিত হয়, এবং .N
কেবলমাত্র সেই লজিকাল ভেক্টরের সমষ্টি যা সারিগুলির সংখ্যা দেয়; পুরো উপসেটটি কখনই উপলব্ধি হয় না। (2) এ, কেবল কলামটি b,c,d
উপসেটে রূপায়িত হয়েছে, অন্যান্য কলামগুলি উপেক্ষা করা হবে।
তবে মধ্যে dplyr
, দর্শনের একটি ফাংশন হ'ল একটি কাজ ঠিকভাবে করা উচিত । অপারেশনটির পরে filter()
আমাদের ফিল্টারকৃত সমস্ত কলামগুলির প্রয়োজন আছে কিনা তা জানার কোনও উপায় নেই (অন্তত বর্তমানে) । আপনি যদি এই জাতীয় কাজগুলি দক্ষতার সাথে সম্পাদন করতে চান তবে আপনাকে আগে চিন্তা করতে হবে। আমি ব্যক্তিগতভাবে এ ক্ষেত্রে এটিকে পাল্টা স্বজ্ঞাত বলে মনে করি।
নোট করুন যে (5) এবং (6) এ, আমরা এখনও কলামটি সাবসেট a
করি যা আমাদের প্রয়োজন হয় না। তবে কীভাবে তা এড়ানো যায় তা আমি নিশ্চিত নই। filter()
ফাংশনে যদি ফিরে আসার জন্য কলামগুলি নির্বাচন করার পক্ষে যুক্তি থাকে, তবে আমরা এই সমস্যাটি এড়াতে পারি, তবে তারপরে ফাংশনটি কেবল একটি কাজ করবে না (এটি একটি dplyr নকশা পছন্দও)।
রেফারেন্স দ্বারা সাব-অ্যাসাইন
dplyr রেফারেন্স দ্বারা কখনও আপডেট হবে না । এটি দুটি প্যাকেজের মধ্যে আরেকটি বিশাল (দার্শনিক) পার্থক্য।
উদাহরণস্বরূপ, ডেটা.টেটেলে আপনি এটি করতে পারেন:
DT[a %in% some_vals, a := NA]
যা শর্তটি সন্তুষ্ট করে কেবল সেই সারিগুলিতে a
রেফারেন্স দিয়ে কলাম আপডেট করে । এই মুহুর্তে dplyr গভীর কপি পুরো ডেটা অনুলিপি করে। একটি নতুন কলাম যুক্ত করার জন্য অভ্যন্তরীণভাবে টেবিল করুন। @ ব্রাদিজি ইতিমধ্যে তার উত্তরে এটি উল্লেখ করেছে।
তবে FR # 617 প্রয়োগ করা হলে গভীর অনুলিপিটি অগভীর অনুলিপি দ্বারা প্রতিস্থাপন করা যেতে পারে । এছাড়াও প্রাসঙ্গিক: dplyr: এফআর # 614 । মনে রাখবেন যে এখনও, আপনি যে কলামটি সংশোধন করেছেন তা সর্বদা অনুলিপি করা হবে (অতএব tad ধীর / কম মেমরি দক্ষ)। রেফারেন্স অনুসারে কলামগুলি আপডেট করার কোনও উপায় থাকবে না।
অন্যান্য কার্যকারিতা
ডেটা.ট্যাবেলে আপনি যোগদানের সময় একত্রিত করতে পারবেন এবং এটি বোঝার জন্য আরও সোজাসাপ্টা এবং মধ্যবর্তী যোগদানের ফলাফল কখনই বাস্তবায়িত হয় না বলে স্মৃতিশক্তি দক্ষ। উদাহরণ হিসাবে এই পোস্টে দেখুন । আপনি dplyr এর ডেটা.ট্যাবিল / ডেটা.ফ্রেম সিনট্যাক্স ব্যবহার করে (এই মুহুর্তে?) পারবেন না।
ডেটা.ট্যাবলের রোলিং বৈশিষ্ট্যটি ডিপ্লায়ারের সিনট্যাক্সেও সমর্থন করে না।
আমরা সম্প্রতি ডেটাতে ওভারল্যাপের সাথে যোগদানের ব্যবস্থাকে বাস্তবায়িত করেছি inter টেকসেটের অন্তরাল রেঞ্জগুলিতে যোগদানের জন্য ( এখানে একটি উদাহরণ রয়েছে ) যা foverlaps()
এই মুহুর্তে একটি পৃথক ফাংশন , এবং তাই পাইপ অপারেটরগুলির সাথে ব্যবহার করা যেতে পারে (ম্যাজিস্ট্রিট / পাইপআর? - নিজে নিজে চেষ্টা করে দেখিনি)।
তবে শেষ পর্যন্ত, আমাদের লক্ষ্য এটিতে একীভূত করা [.data.table
যাতে আমরা অন্যান্য বৈশিষ্ট্য যেমন গ্রুপিং, যোগ দেওয়ার সময় একত্রিত করা ইত্যাদি সংগ্রহ করতে পারি which যার উপরে বর্ণিত একই সীমাবদ্ধতা থাকবে।
১.৯.৪ থেকে ডেটা টেবিল নিয়মিত আর সিনট্যাক্সে দ্রুত বাইনারি অনুসন্ধান ভিত্তিক সাবসেটগুলির জন্য গৌণ কীগুলি ব্যবহার করে স্বয়ংক্রিয় সূচক প্রয়োগ করে। উদাহরণস্বরূপ: DT[x == 1]
এবং DT[x %in% some_vals]
স্বয়ংক্রিয়ভাবে প্রথম রানটিতে একটি সূচক তৈরি করবে, যা পরে একই কলাম থেকে ধারাবাহিক সাবসেটগুলিতে বাইনারি অনুসন্ধান ব্যবহার করে দ্রুত উপসেটে ব্যবহৃত হবে। এই বৈশিষ্ট্যটি বিকাশ অব্যাহত থাকবে। এই বৈশিষ্ট্যটির একটি সংক্ষিপ্ত বিবরণ জন্য এই সূচনা পরীক্ষা করুন ।
পথে filter()
data.tables জন্য প্রয়োগ করা হয়, এটা সুবিধা এই বৈশিষ্ট্যটির নেয় না।
একটি dplyr বৈশিষ্ট্য হ'ল এটি একই সিনট্যাক্স ব্যবহার করে ডেটাবেসগুলিতে ইন্টারফেসও সরবরাহ করে, যা ডেটা.টিটেবল এই মুহুর্তে করে না।
সুতরাং, আপনাকে এগুলি (এবং সম্ভবত অন্যান্য পয়েন্টগুলি) মাপতে হবে এবং এই ট্রেড-অফগুলি আপনার কাছে গ্রহণযোগ্য কিনা তার ভিত্তিতে সিদ্ধান্ত নিতে হবে।
এইচটিএইচ
(1) নোট করুন যে স্মৃতিশক্তি দক্ষ হওয়ার কারণে সরাসরি গতিতে প্রভাব পড়ে (বিশেষত ডেটা আরও বড় হওয়ার সাথে সাথে), কারণ বেশিরভাগ ক্ষেত্রে বাধাটি মূল মেমরি থেকে ডেটা ক্যাশে স্থানান্তরিত করে (এবং যতটা সম্ভব ক্যাশে ডেটা ব্যবহার করা যায় - ক্যাশে মিস করা কমিয়ে দেয়) - যাতে মূল স্মৃতি অ্যাক্সেস হ্রাস করতে পারে)। এখানে বিশদে যাচ্ছি না।
dplyr
ডেটা টেবিলগুলির জন্য পদ্ধতি রয়েছে তবে ডেটা টেবিলের নিজস্ব তুলনামূলক পদ্ধতিও রয়েছে