data.table
অবজেক্টের এখন একটি: = অপারেটর রয়েছে। এই অপারেটরটি অন্য সমস্ত অ্যাসাইনমেন্ট অপারেটর থেকে আলাদা কী করে? এছাড়াও, এর ব্যবহারগুলি কী কী, এটি কত দ্রুত এবং কখন এড়ানো উচিত?
data.table
অবজেক্টের এখন একটি: = অপারেটর রয়েছে। এই অপারেটরটি অন্য সমস্ত অ্যাসাইনমেন্ট অপারেটর থেকে আলাদা কী করে? এছাড়াও, এর ব্যবহারগুলি কী কী, এটি কত দ্রুত এবং কখন এড়ানো উচিত?
উত্তর:
এখানে 10 মিনিট হ্রাস করে 1 সেকেন্ডে দেখানো উদাহরণ ( হোমপেজে NEWS থেকে )। এটি একটিতে সাবসাইন করার মতো data.frame
তবে প্রতিবার পুরো টেবিলটি অনুলিপি করে না।
m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)
system.time(for (i in 1:1000) DF[i,1] <- i)
user system elapsed
287.062 302.627 591.984
system.time(for (i in 1:1000) DT[i,V1:=i])
user system elapsed
1.148 0.000 1.158 ( 511 times faster )
ফেলে :=
মধ্যে j
যে আরো বাগধারার পারবেন মত:
DT["a",done:=TRUE] # binary search for group 'a' and set a flag
DT[,newcol:=42] # add a new column by reference (no copy of existing data)
DT[,col:=NULL] # remove a column by reference
এবং :
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
আমি এড়ানোর কোনও কারণ ভাবতে পারি না :=
! একটি for
লুপ ভিতরে অন্য ছাড়া । যেহেতু :=
ভিতরে উপস্থিত হয়েছে DT[...]
, এটি [.data.table
পদ্ধতির ছোট ওভারহেড সহ আসে ; যেমন, এস 3 ডিসপ্যাচ এবং উপস্থিতি এবং যেমন আর্গুমেন্ট টাইপ জন্য চেক i
, by
, nomatch
ভিতরে জন্য ইত্যাদি সুতরাং for
লুপ, একটি কম ওভারহেড, সরাসরি সংস্করণ :=
বলা set
। দেখুন ?set
আরো বিস্তারিত জানার এবং উদাহরণ জন্য। এর অসুবিধাগুলির set
মধ্যে i
অবশ্যই সারি সংখ্যা হওয়া উচিত (কোনও বাইনারি অনুসন্ধান নয়) এবং আপনি এটির সাথে একত্রিত করতে পারবেন না by
। এই বিধিনিষেধ তৈরি set
করে ওভারহেড নাটকীয়ভাবে হ্রাস করতে পারে।
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)
সেট "V1"
থাকাকালীন কলাম set(DT, i, colVar, i)
সেট কলামের নামের অন্তর্ভুক্ত colVar
পরিবর্তনশীল (যেমন যদি colVar = "V1"
তার আগে করা হয়েছিল)। উদ্ধৃতিগুলি ভেরিয়েবলটি দেখার চেয়ে কলামের নামটি অক্ষরে অক্ষরে নেওয়ার নির্দেশ দেয়।