সংক্ষিপ্ত বিবরণ
আমি তুলনামূলকভাবে পরিচিত, এর সাথে data.tableতেমন কিছু না dplyr। আমি কিছু dplyrভিগনেট এবং উদাহরণগুলি পড়েছি যা এসও-তে উঠে এসেছে এবং এখন পর্যন্ত আমার সিদ্ধান্তগুলি এই যে:
data.tableএবংdplyrগতিতে তুলনীয়, যখন অনেকগুলি (যেমন> 10-100 কে) গ্রুপ রয়েছে এবং অন্য কিছু পরিস্থিতিতে (নীচে মাপদণ্ড দেখুন)dplyrআরও অ্যাক্সেসযোগ্য সিনট্যাক্স রয়েছেdplyrবিমূর্ত (বা উইল) সম্ভাব্য ডিবি ইন্টারঅ্যাকশন- কিছু ছোট কার্যকারিতা পার্থক্য রয়েছে (নীচে "উদাহরণ / ব্যবহার" দেখুন)
আমার মনে 2 খুব বেশি ওজন সহ্য করে না কারণ আমি এটির সাথে মোটামুটি পরিচিত data.table, যদিও আমি বুঝতে পেরেছি যে উভয়ের ক্ষেত্রে নতুন ব্যবহারকারীদের জন্য এটি একটি বড় কারণ হয়ে উঠবে। আমি এমন যুক্তি এড়াতে চাই যা সম্পর্কে আরও স্বজ্ঞাত, কারণ এটি ইতিমধ্যে পরিচিত কারও দৃষ্টিকোণ থেকে আমার নির্দিষ্ট প্রশ্নের জন্য জিজ্ঞাসা করা অপ্রাসঙ্গিক data.table। "আরও স্বজ্ঞাত" কীভাবে দ্রুত বিশ্লেষণের দিকে নিয়ে যায় সে সম্পর্কে একটি আলোচনা এড়াতে চাই (অবশ্যই সত্য, তবে আবার, আমি এখানে কী সম্পর্কে সবচেয়ে আগ্রহী তা নয়)।
প্রশ্ন
আমি যা জানতে চাই তা হ'ল:
- বিশ্লেষণমূলক কাজগুলি রয়েছে যা প্যাকেজগুলির সাথে পরিচিত ব্যক্তিদের জন্য এক বা অন্য প্যাকেজের সাথে কোড করা অনেক সহজ (যেমন কী-স্ট্রোকের কিছু সংমিশ্রণ প্রয়োজন বনাম প্রয়োজনীয় স্তরের প্রয়োজন, যেখানে প্রতিটিটির কম কাজই ভাল জিনিস)।
- এমন একটি বিশ্লেষণমূলক কাজ রয়েছে যা একটি প্যাকেজ বনাম অন্য প্যাকেজে আরও দক্ষতার সাথে (যেমন 2x এর বেশি) সম্পাদিত হয়।
একটি সাম্প্রতিক একটি SO প্রশ্ন আমাকে এই সম্পর্কে আরও কিছুটা ভাবতে বাধ্য করেছে, কারণ আমি এখনও ভাবিনি dplyrযে আমি ইতিমধ্যে যা করতে পারি তার থেকে অনেক বেশি অফার করবে data.table। dplyrসমাধানটি এখানে রয়েছে (Q এর শেষে থাকা ডেটা):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
কোন data.tableসমাধানে আমার হ্যাক প্রচেষ্টা চেয়ে অনেক ভাল ছিল । এটি বলেছিল, ভাল data.tableসমাধানগুলিও বেশ ভাল (ধন্যবাদ জিন-রবার্ট, অরুণ, এবং এখানে নোট করুন আমি কঠোরতম সর্বোত্তম সমাধানের জন্য একক বক্তব্যকে সমর্থন করেছি):
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
পরেরটির সিনট্যাক্সটি খুব গৌরবময় মনে হতে পারে তবে আপনি যদি অভ্যস্ত হন data.table(তবে আরও কিছু রহস্যজনক কৌশল ব্যবহার করেন না) তবে এটি আসলে বেশ সরল ।
মূলত কি আমি দেখতে চাই কিছু ভাল উদাহরণ ছিল dplyrবা data.tableপথ অনেক বেশি সংক্ষিপ্ত বা সঞ্চালিত যথেষ্ট ভাল।
উদাহরণ
ব্যবহারdplyrগোষ্ঠীভিত্তিক ক্রিয়াকলাপগুলিকে অনুমতি দেয় না যা স্বেচ্ছাসেবী সংখ্যার সারিগুলি ফেরত দেয় ( এড্ডির প্রশ্ন থেকে , দ্রষ্টব্য: এটি দেখে মনে হচ্ছে এটি dplyr 0.5 তে প্রয়োগ করা হবে , এছাড়াও,do@ বিগিনিআর @ এড্ডির প্রশ্নের উত্তরে ব্যবহারের সম্ভাব্য কাজ দেখায় )।data.tableসমর্থন ঘূর্ণায়মান যোগদান করে (ধন্যবাদ @dholstius) পাশাপাশি ওভারল্যাপ যোগদান করেdata.tableঅভ্যন্তরীণভাবে ফর্মের অভিব্যক্তিDT[col == value]বা স্বয়ংক্রিয় সূচকের মাধ্যমে গতিরDT[col %in% values]পক্ষে অনুকূল হয় যা একই বেস আর সিনট্যাক্স ব্যবহার করার সময় বাইনারি অনুসন্ধান ব্যবহার করে। আরও কিছু বিশদ এবং একটি ক্ষুদ্র মানদণ্ডের জন্য এখানে দেখুন ।dplyrক্রিয়াকলাপগুলির (যেমনregroup,summarize_each_) এর স্ট্যান্ডার্ড মূল্যায়ন সংস্করণ সরবরাহ করে যা প্রোগ্রামের ব্যবহারকে সহজ করতে পারেdplyr(নোটের প্রোগ্রাম্যাটিক ব্যবহারdata.tableঅবশ্যই স্পষ্টভাবে সম্ভব, কেবলমাত্র কিছু যত্নশীল চিন্তাভাবনা, প্রতিস্থাপন / উদ্ধৃতি ইত্যাদি অন্তত আমার জ্ঞানের প্রয়োজন)
- আমি আমার নিজস্ব বেঞ্চমার্ক দৌড়েছি এবং উভয় প্যাকেজই "বিভক্ত প্রয়োগ সংহত" শৈলীর বিশ্লেষণে তুলনীয় হিসাবে খুঁজে পেয়েছি, যখন সেখানে প্রচুর সংখ্যক গোষ্ঠী (> 100 কে) থাকে যেখানে পয়েন্টটি
data.tableযথেষ্ট দ্রুত হয়ে যায় except - @ অরুন যোগদানের জন্য কিছু মানদণ্ড চালিয়েছে , যা দেখায় যে
data.tableস্কেলগুলিdplyrগ্রুপ সংখ্যা বাড়ার চেয়ে ভাল (উভয় প্যাকেজ এবং সাম্প্রতিক সংস্করণে সাম্প্রতিক বর্ধনের সাথে আপডেট হয়েছে) increase এছাড়াও, বেঞ্চমার্ক যখন পেতে চেষ্টা অনন্য মান রয়েছেdata.tableদ্রুত ~ 6x। - (যাচাই করা হয়নি)
data.tableএকটি গ্রুপ / প্রয়োগ / সাজানোর বৃহত সংস্করণে 75% দ্রুত রয়েছে যখন ছোটগুলিতেdplyr40% দ্রুত ছিল ( মন্তব্যগুলি থেকে ধন্যবাদ, ধন্যবাদ ড্যানাস) - ম্যাট, প্রধান লেখক
data.table, হয়েছে উপর অপারেশন গোষ্ঠীবদ্ধ benchmarkeddata.table,dplyrএবং পাইথনpandasপর্যন্ত 2 বিলিয়ন সারি (RAM- র মধ্যে ~ 100GB) এ । - একটি 80K গোষ্ঠীর উপরে পুরোনো বেঞ্চমার্ক হয়েছে
data.table~ 8x দ্রুত
উপাত্ত
এটি প্রথম উদাহরণ হিসাবে আমি প্রশ্ন বিভাগে দেখিয়েছি।
dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob",
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L,
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L,
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager",
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager",
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id",
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA,
-16L))
dplyrএবং উভয় data.tableদলই মাপদণ্ডে কাজ করছে, সুতরাং কোনও উত্তর এখানে আসবে। # 2 (বাক্য গঠন) ইমো কঠোরভাবে মিথ্যা, তবে এটি স্পষ্টতই মতামত অঞ্চলে চলেছে, তাই আমিও বন্ধ করতে ভোট দিচ্ছি।
(d)plyrপরিমাপ করেছে 0
dplyrএবং plyrসিনট্যাক্সের সাথে সম্পর্কিত করে তোলে এবং মূলত আমি তাদের সিনট্যাক্সকে অপছন্দ করি তার মূল কারণটি হ'ল আমাকে আরও অনেক পদ্ধতি শিখতে হয় (1 টিরও বেশি পড়ুন) অতিরিক্ত ফাংশনগুলি ( এখনও নামগুলির সাথে) আমার জন্য অর্থবোধ করবেন না), তারা কী করে মনে রাখবেন, কী যুক্তি গ্রহণ করেন ইত্যাদি That এটি প্লাইর-দর্শন থেকে আমার পক্ষে সর্বদা একটি বিশাল পরিবর্তন।
.SD)। [গুরুত্ব সহকারে] আমি মনে করি এগুলি বৈধ নকশার পার্থক্য যা বিভিন্ন লোকের কাছে আবেদন করবে
dplyrএকটিকে পড়ার ক্ষেত্রে একই সমাধানটি হ'ল:as.data.table(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by = list(name, job)]