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"তার আগে করা হয়েছিল)। উদ্ধৃতিগুলি ভেরিয়েবলটি দেখার চেয়ে কলামের নামটি অক্ষরে অক্ষরে নেওয়ার নির্দেশ দেয়।