Rbindlist rbind এর চেয়ে ভাল "কেন"?


135

আমি ডকুমেন্টেশন দিয়ে যাচ্ছি data.tableএবং এসওতে এখানে কথোপকথনের কিছু থেকেও লক্ষ্য করেছি যা এর থেকে rbindlistভাল বলে মনে করা হচ্ছে rbind

আমি জানতে চাই কেন এর rbindlistচেয়ে ভাল কেন rbindএবং কোন পরিস্থিতিতে rbindlistসত্যিকার অর্থেই ছাড়িয়ে যায় rbind?

স্মৃতি ব্যবহারের ক্ষেত্রে কোনও সুবিধা আছে কি?

উত্তর:


155

rbindlistএটির একটি অনুকূলিত সংস্করণ do.call(rbind, list(...))যা ব্যবহারের সময় ধীর হওয়ার জন্য পরিচিতrbind.data.frame


এটি সত্যই কোথায় এক্সেল

এমন কিছু প্রশ্ন যা দেখায় যে rbindlistচকচকে আছে

সারি অনুসারে ডাটা.ফ্রেমগুলির তালিকার দ্রুত ভেক্টরাইজড মার্জ

Do.all এবং ldply ব্যবহার করে ডেটা.ফ্রেমগুলির দীর্ঘ তালিকা (1 মিলিয়ন ডলার) রূপান্তর করতে সমস্যা f

এগুলির মানদণ্ড রয়েছে যা দেখায় যে এটি কত দ্রুত হতে পারে।


rbind.data.frame এক কারণে ধীর

rbind.data.frameপ্রচুর চেকিং করে, এবং নাম অনুসারে মিলবে। (যেমন rbind.data.frame কলামগুলি বিভিন্ন ক্রমে থাকতে পারে এবং নাম অনুসারে rbindlistমিলবে ) এর জন্য অ্যাকাউন্ট করবে, এই ধরণের চেকিং করে না এবং অবস্থানের সাথে যোগ দেবে

যেমন

do.call(rbind, list(data.frame(a = 1:2, b = 2:3), data.frame(b = 1:2, a = 2:3)))
##    a b
## 1  1 2
## 2  2 3
## 3  2 1
## 4  3 2

rbindlist(list(data.frame(a = 1:5, b = 2:6), data.frame(b = 1:5, a = 2:6)))
##     a b
##  1: 1 2
##  2: 2 3
##  3: 1 2
##  4: 2 3

Rbindlist এর অন্যান্য কিছু সীমাবদ্ধতা

এটি ঠিক করারfactors পরেও ঠিক করা একটি বাগের কারণে এটি মোকাবেলা করতে লড়াই করত :

rbindlist দুটি data.tables যেখানে একটিতে ফ্যাক্টর থাকে এবং অন্যটির কলামের জন্য অক্ষর টাইপ থাকে ( বাগ # 2650 )

এটির সদৃশ কলামের নাম নিয়ে সমস্যা আছে

দেখতে সতর্কবাণী বার্তা: rbindlist মধ্যে (allargs): data.table সম্ভব বাগ: বলপ্রয়োগ চালু NAS? ( বাগ # 2384 )


rbind.data.frame rownames হতাশাজনক হতে পারে

rbindlistহ্যান্ডেল করতে পারে lists data.framesএবং data.tables, এবং rownames ছাড়াই একটি ডেটা টেবিল ফিরে আসবে

আপনি do.call(rbind, list(...)) দেখতে ব্যবহার করে রবনেমসের জঞ্জাল পেতে পারেন

Do.call এর ভিতরে rbind ব্যবহার করার সময় কীভাবে সারিগুলির নাম পরিবর্তন করা যায়?


স্মৃতি দক্ষতা

মেমরির ক্ষেত্রে rbindlistযেমন প্রয়োগ করা হয় Cতেমনি মেমরি দক্ষ, এটি setattrরেফারেন্স দ্বারা বৈশিষ্ট্যগুলি সেট করতে ব্যবহার করে

rbind.data.frameবাস্তবায়িত হয় R, এটা বরাদ্দ প্রচুর, এবং ব্যবহার করে attr<-(এবং class<-এবং rownames<-হবে (অভ্যন্তরীণভাবে) তৈরি data.frame কপি তৈরি যা সব।


1
অবগতির জন্য attr<-, class<-এবং (আমি মনে করি) rownames<-সব জায়গায় পরিবর্তন করুন।
হ্যাডলি

5
আপনি কি নিশ্চিত? ব্যবহার করে দেখুন DF = data.frame(a=1:3); .Internal(inspect(DF)); tracemem(DF); attr(DF,"test") <- "hello"; .Internal(inspect(DF))
ম্যাট ডাউলে

4
rbind.data.frameবিশেষ "হাইজ্যাকিং" যুক্তিযুক্ত রয়েছে - যখন এর প্রথম যুক্তিটি হ'ল data.tableএটি .rbind.data.tableপরিবর্তে কল করে, যা কিছুটা পরীক্ষা করে এবং তারপরে rbindlistঅভ্যন্তরীণভাবে কল করে। তাই আপনি যদি ইতিমধ্যে আছে যদি data.tableবাধতে বস্তু, তার মাঝে সম্ভবত সামান্য কর্মক্ষমতা পার্থক্য rbindএবং rbindlist
কেন উইলিয়ামস

6
মণেল, এই পোস্টটির সম্ভবত সম্পাদনা দরকার, এখন এটি rbindlistনামের সাথে মিলে যেতে সক্ষম ( use.names=TRUE) এবং নিখোঁজ কলামগুলিও পূরণ করতে পারে ( fill=TRUE)। আমি এই , এই এবং এই পোস্ট আপডেট করেছি । আপনি কি এটি সম্পাদনা করতে আপত্তি করেন নাকি আমি তা যদি ঠিক করি তবে তা ঠিক আছে? যেভাবেই হোক আমার দ্বারা ভাল fine
অরুণ

1
dplyr::rbind_listএছাড়াও বেশ অনুরূপ
হ্যাডলি

48

দ্বারা v1.9.2, rbindlistবেশ খানিকটা বিকশিত হয়েছিল, যার মধ্যে রয়েছে অনেকগুলি বৈশিষ্ট্য:

  • SEXPTYPEবাঁধাইয়ের সময় সর্বাধিক কলামগুলি নির্বাচন করা - এফআর # 2456 এবং বাগ # 4981v1.9.2 বন্ধ করে কার্যকর করা হয়েছে ।
  • পরিচালনা factorকলাম সঠিকভাবে - প্রথম বাস্তবায়িত v1.8.10বন্ধ বাগ # 2650 বাঁধাই এবং বর্ধিত আদেশ সাবধানে মধ্যে কারণের v1.9.2পাশাপাশি, ক্লোজিং এফ আর # 4856 এবং বাগ # 5019

তদ্ব্যতীত, ইন v1.9.2, rbind.data.tableএকটি fillযুক্তিও অর্জন করেছিল , যা আর এ প্রয়োগ করে নিখোঁজ কলামগুলি পূরণ করে বাঁধাই করতে দেয়।

এখন v1.9.3, এই বিদ্যমান বৈশিষ্ট্যগুলিতে আরও আরও উন্নতি রয়েছে:

  • rbindlistএকটি যুক্তি অর্জন করে use.names, যা পূর্বনির্ধারিতভাবে FALSEপিছনের সামঞ্জস্যের জন্য।
  • rbindlistএছাড়াও একটি যুক্তি অর্জন করে fill, যা পূর্বনির্ধারিতভাবে FALSEপিছনের সামঞ্জস্যের জন্যও ।
  • এই বৈশিষ্ট্যগুলি সমস্ত সিতে প্রয়োগ করা হয়েছে এবং কার্যকরীতা যুক্ত করার সময় গতিতে কোনও আপস না করার জন্য সাবধানতার সাথে লিখিত হয়েছে।
  • যেহেতু rbindlistএখন নামের সাথে মেলে এবং অনুপস্থিত কলামগুলি পূরণ করতে পারে, rbind.data.tableকেবল rbindlistএখনই কল । পার্থক্যটি সামঞ্জস্যতার use.names=TRUEজন্য কেবলমাত্র ডিফল্টরূপে rbind.data.table

rbind.data.frameবেশিরভাগ কপি করে (যা @ মণিও উল্লেখ করে) যেগুলি এড়ানো যেতে পারে (সি তে চলে যাওয়ার কারণে) বেশ খানিকটা ধীর হয়ে যায়। আমি মনে করি এটিই একমাত্র কারণ নয়। কলামের নাম চেক করার / ম্যাচ করার জন্য বাস্তবায়নটি rbind.data.frameযখন ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে তাশূন্য করতে পারে যখন ডাটা.ফ্রেমে প্রতি কলাম অনেক বেশি থাকে এবং সেখানে এমন অনেকগুলি ডেটা ফ্রেম থাকে যা বাঁধতে হয় (নীচে বেঞ্চমার্কে দেখানো হয়েছে)।

তবে, rbindlistঅভাব (সম্পাদনা) নির্দিষ্ট বৈশিষ্ট্যগুলি (যেমন ফ্যাক্টর স্তরগুলি পরীক্ষা করা বা নামগুলির সাথে মিল রাখা) এটির তুলনায় খুব দ্রুত ওজনের সাথে খুব ক্ষুদ্র (বা কোনও) ওজন বহন করে না rbind.data.frame। কারণ সেগুলি সিটিতে সাবধানতার সাথে প্রয়োগ করা হয়েছিল, গতি এবং মেমরির জন্য অনুকূলিত।

এখানে একটি মানদণ্ড যা কলামের নামের সাথে মিলের পাশাপাশি rbindlistএর use.namesবৈশিষ্ট্যটি ব্যবহার করে দক্ষ বাঁধনকে হাইলাইট করে v1.9.3। ডেটা সেটটিতে 10000 ডেটা থাকে। আকার 10 * 500 এর প্রতিটি ফ্রেম করে।

বিশেষ দ্রষ্টব্য: এই বেঞ্চমার্ক করার জন্য একটি তুলনা অন্তর্ভুক্ত আপডেট করা হয়েছে dplyrএরbind_rows

library(data.table) # 1.11.5, 2018-06-02 00:09:06 UTC
library(dplyr) # 0.7.5.9000, 2018-06-12 01:41:40 UTC
set.seed(1L)
names = paste0("V", 1:500)
cols = 500L
foo <- function() {
    data = as.data.frame(setDT(lapply(1:cols, function(x) sample(10))))
    setnames(data, sample(names))
}
n = 10e3L
ll = vector("list", n)
for (i in 1:n) {
    .Call("Csetlistelt", ll, i, foo())
}

system.time(ans1 <- rbindlist(ll))
#  user  system elapsed 
# 1.226   0.070   1.296 

system.time(ans2 <- rbindlist(ll, use.names=TRUE))
#  user  system elapsed 
# 2.635   0.129   2.772 

system.time(ans3 <- do.call("rbind", ll))
#   user  system elapsed 
# 36.932   1.628  38.594 

system.time(ans4 <- bind_rows(ll))
#   user  system elapsed 
# 48.754   0.384  49.224 

identical(ans2, setDT(ans3)) 
# [1] TRUE
identical(ans2, setDT(ans4))
# [1] TRUE

নামগুলির জন্য পরীক্ষা না করে যেমন কলামগুলি বাঁধাই হয়েছে ঠিক ১.৩ নিয়েছে যেখানে কলামের নামগুলি পরীক্ষা করা এবং বাঁধাই করার জন্য যথাযথভাবে মাত্র 1.5 সেকেন্ড সময় নিয়েছে। বেস সলিউশনের তুলনায়, এটি 14x দ্রুত এবং dplyrসংস্করণটির তুলনায় 18x দ্রুত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.