সংক্ষিপ্ত বিবরণ
আমি তুলনামূলকভাবে পরিচিত, এর সাথে 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% দ্রুত রয়েছে যখন ছোটগুলিতেdplyr
40% দ্রুত ছিল ( মন্তব্যগুলি থেকে ধন্যবাদ, ধন্যবাদ ড্যানাস) - ম্যাট, প্রধান লেখক
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)]