ডেটা.ট্যাবেলে আমি কখন = অপারেটরটি ব্যবহার করব?


88

data.tableঅবজেক্টের এখন একটি: = অপারেটর রয়েছে। এই অপারেটরটি অন্য সমস্ত অ্যাসাইনমেন্ট অপারেটর থেকে আলাদা কী করে? এছাড়াও, এর ব্যবহারগুলি কী কী, এটি কত দ্রুত এবং কখন এড়ানো উচিত?

উত্তর:


95

এখানে 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

27
এই প্যাকেজ বিকাশের জন্য ধন্যবাদ। আমার এই অনুভূতি আছে যে আমি এই প্যাকেজটি ব্যবহার করার জন্য আমার প্রচুর কোড সংশোধন করব।
ইলেটর

4
আড্ডায় আমাকে স্ব জিজ্ঞাসা / উত্তর জিজ্ঞাসা করা হয়েছিল (যা স্পষ্টতই উত্সাহিত হয় ) - এই প্রশ্নটি এখানে রয়েছে
ম্যাট ডাউল

4
@ ম্যাথেজডওলে কখন ব্যবহার করবেন না: = এবং এর পরিবর্তে সেট () ব্যবহার করতে চান তার একটি ব্যাখ্যা অন্তর্ভুক্ত করতে চান?
এরি বি ফ্রেডম্যান

4
@ ম্যাথহেডোলে আমি যদি আবার +1 করতাম তবে পারতাম।
এরি বি ফ্রেডম্যান

4
@jabberwocky কোন সমস্যা নেই set(DT, i, "V1", i)সেট "V1"থাকাকালীন কলাম set(DT, i, colVar, i)সেট কলামের নামের অন্তর্ভুক্ত colVarপরিবর্তনশীল (যেমন যদি colVar = "V1"তার আগে করা হয়েছিল)। উদ্ধৃতিগুলি ভেরিয়েবলটি দেখার চেয়ে কলামের নামটি অক্ষরে অক্ষরে নেওয়ার নির্দেশ দেয়।
ম্যাট ডাওল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.