ডেটা.টিবেলে কী কী সেট করার উদ্দেশ্য?


113

আমি ডেটা টেবিল ব্যবহার করছি এবং অনেকগুলি ফাংশন রয়েছে যার জন্য আমাকে একটি কী (যেমন X[Y]) সেট করতে হবে । এই হিসাবে, আমি আমার ডেটা টেবিলগুলিতে কীগুলি সঠিকভাবে সেট করতে একটি কী কী তা বুঝতে আগ্রহী।


আমি পড়েছিলাম একটি উত্স ছিল ?setkey

setkey()একটি বাছাই করে data.tableএবং চিহ্ন হিসাবে এটি সাজানো। সাজানো কলামগুলি হ'ল চাবিকাঠি। কীটি কোনও ক্রমে যে কোনও কলাম হতে পারে। কলামগুলি সর্বদা ক্রমবর্ধমান ক্রমে সাজানো হয়। টেবিলটি রেফারেন্স দ্বারা পরিবর্তিত হয়। এক কলামের মতো অস্থায়ী কাজের স্মৃতি ছাড়া অন্য কোনও অনুলিপি তৈরি হয় না।

এখানে আমার গ্রহণযোগ্যতাটি হ'ল কোনও কীটি ডেটাটিকে "বাছাই" করে দেয় able টেবিল, এর ফলে খুব অনুরূপ প্রভাব পড়ে order()। তবে এটি চাবি থাকার উদ্দেশ্য ব্যাখ্যা করে না।


ডেটা.টিবেল এফএকিউ 3.2 এবং 3.3 ব্যাখ্যা করে:

৩.২ বড় টেবিলে আমার কী নেই, তবে গ্রুপিং এখনও সত্যই দ্রুত। কেন এমন?

ডেটা.ট্যাবেলে র‌্যাডিক্স বাছাই ব্যবহার করা হয়। এটি অন্যান্য ধরণের অ্যালগরিদমের তুলনায় লক্ষণীয়ভাবে দ্রুত। মূলগুলি কেবলমাত্র পূর্ণসংখ্যার জন্যই হয়, দেখুন ?base::sort.list(x,method="radix")setkey()দ্রুত হওয়া কেন এটিও একটি কারণ । যখন কোনও কী সেট করা হয় না, বা আমরা কী থেকে আলাদা ক্রমে গোষ্ঠী করি, আমরা এটিকে একটি অ্যাডহক বলি।

৩.৩ কেনে কলামগুলিতে গ্রুপিং করা হচ্ছে এইডের চেয়ে দ্রুত?

যেহেতু প্রতিটি গোষ্ঠী র‍্যামের সাথে সংলগ্ন, এর ফলে পৃষ্ঠা আনা কমান, এবং মেমরিটি memcpyসি তে লুপিংয়ের পরিবর্তে বাল্ক ( সি) তে অনুলিপি করা যায়

এখান থেকে, আমি অনুমান করি যে কোনও কীটি সেট করার ফলে আরকে অন্যান্য অ্যালগরিদমের উপর "রেডিক্স বাছাই করা" ব্যবহার করার অনুমতি দেওয়া হয়, এবং সে কারণেই এটি আরও দ্রুত।


10 মিনিটের দ্রুত শুরু গাইডের কীগুলির জন্য একটি গাইডও রয়েছে।

  1. কী

আসুন ডেটা.ফ্রেমে বিবেচনা করে শুরু করা যাক, বিশেষত রোনাম (বা ইংরাজীতে, সারি নাম)। অর্থাৎ একক সারিতে থাকা একাধিক নাম। একক সারিতে একাধিক নাম? এটি একটি ডেটা.ফ্রেমে আমরা অভ্যস্ত নই। আমরা জানি যে প্রতিটি সারিতে সর্বাধিক একটির নাম রয়েছে। একজন ব্যক্তির কমপক্ষে দুটি নাম, প্রথম নাম এবং দ্বিতীয় নাম থাকে। এটি একটি টেলিফোন ডিরেক্টরি সংগঠিত করতে দরকারী, উদাহরণস্বরূপ, যা নাম দ্বারা সাজানো হয়, তারপরে প্রথম নাম। তবে ডেটা.ফ্রেমে প্রতিটি সারিতে কেবল একটি নাম থাকতে পারে।

একটি কীটিতে রোউনামগুলির এক বা একাধিক কলাম রয়েছে, যা পূর্ণসংখ্যার, গুণক, চরিত্র বা অন্য কোনও শ্রেণি হতে পারে, কেবল চরিত্র নয়। তদতিরিক্ত, সারিগুলি কী দ্বারা বাছাই করা হয়। অতএব, একটি ডেটা টেবিলের সর্বাধিক একটি কী থাকতে পারে কারণ এটি একাধিক উপায়ে বাছাই করা যায় না।

স্বতন্ত্রতা প্রয়োগ করা হয় না, অর্থাত নকল কী মান অনুমোদিত। যেহেতু সারিগুলি কী অনুসারে বাছাই করা হয়েছে, চাবির কোনও সদৃশ ক্রমাগত প্রদর্শিত হবে

টেলিফোন ডিরেক্টরিটি কী কী তা বোঝার জন্য সহায়ক ছিল, তবে ফ্যাক্টর কলামের তুলনায় কোনও কীটি আলাদা নয় বলে মনে হয়। তদ্ব্যতীত, কী কী প্রয়োজন (বিশেষত কিছু নির্দিষ্ট ক্রিয়াকলাপ ব্যবহার করতে হয়) এবং কী হিসাবে কী হিসাবে সেট করতে কলামটি চয়ন করবেন তা এটি ব্যাখ্যা করে না। এছাড়াও, মনে হয় যে একটি কলাম হিসাবে সময়ের সাথে একটি তথ্য। টেবিলের সাথে, অন্য কোনও কলামটি কী হিসাবে সেট করা সম্ভবত সময় কলামকেও বিচলিত করে দেবে, যা এটিকে আরও বিভ্রান্তিকর করে তোলে কারণ আমি জানি না যে আমাকে অন্য কোনও কলাম সেট করার অনুমতি রয়েছে কিনা? চাবি. আমাকে দয়া করে কেউ আলোকিত করতে পারেন?


"আমি অনুমান করি যে কোনও কীটি সেট করার ফলে আর-কে অন্যান্য অ্যালগরিদমের উপরে" রেডিক্স বাছাই করা "ব্যবহার করতে দেওয়া হয় - আমি এটিকে সাহায্য থেকে পাই না। আমার পঠন হ'ল একটি চাবি দ্বারা কোনও কী বাছাই করা। আপনি কী থেকে অন্য কলামগুলিতে বাছাই করে "অ্যাডহক" করতে পারেন এবং এটি দ্রুত, তবে আপনি ইতিমধ্যে বাছাই করা তত দ্রুত নয়।
এরি বি ফ্রেডম্যান

আমি মনে করি যে সারিগুলি নির্বাচন করার সময় বাইনারি অনুসন্ধান ভেক্টর স্ক্যানের চেয়ে দ্রুত। আমি কম্পিউটার বিজ্ঞানী নই, তাই আসলে এর অর্থ কী তা আমি জানি না। এফএকিউ ছাড়াও ভূমিকা দেখুন
ফ্রাঙ্ক

উত্তর:


125

গৌণ আপডেট: দয়া করে নতুন এইচটিএমএল ভিগনেটগুলিও দেখুনএই ইস্যুটি অন্যান্য পরিকল্পনাগুলিকে হাইলাইট করে যা আমরা পরিকল্পনা করি।


অ্যাড-হক যোগদানের on=অনুমতি দেয় এমন নতুন বৈশিষ্ট্যের আলোকে আমি এই উত্তরটি আবার (ফেব্রুয়ারী 2016) আপডেট করেছি । পূর্ববর্তী (পুরানো) উত্তরের জন্য ইতিহাস দেখুন।

ঠিক setkey(DT, a, b)কি করে?

এটি দুটি কাজ করে:

  1. reorders সারি data.table DT প্রদান কলাম (গুলি) (দ্বারা একটি , ) রেফারেন্স দ্বারা , সবসময় মধ্যে বৃদ্ধি অর্ডার।
  2. চিহ্ন হিসাবে যারা কলাম কী কলাম একটি বৈশিষ্ট্য বলা সেটিং দ্বারা sortedকরতে DT

রেকর্ডকারী উভয় দ্রুত (কারণে data.table এবং মেমরি দক্ষ এর অভ্যন্তরীণ র্যাডিক্স বাছাই) (শুধুমাত্র এক ধরনের অতিরিক্ত কলাম ডবল বরাদ্দ করা হয়)।

কখন setkey()দরকার?

দলবদ্ধকরণের ক্রিয়াকলাপগুলির জন্য setkey()কখনই নিরঙ্কুশ প্রয়োজন ছিল না। যে, আমরা একটি শীতল দ্বারা বা অ্যাডহোক বাই করতে পারেন ।

## "cold" by
require(data.table)
DT <- data.table(x=rep(1:5, each=2), y=1:10)
DT[, mean(y), by=x] # no key is set, order of groups preserved in result

যাইহোক, পূর্বে v1.9.6, সেট করা x[i]প্রয়োজন ফর্ম যোগদান । V1.9.6 + থেকে নতুন যুক্তি সহ, এটি আর সত্য নয়, এবং কীগুলি সেট করা এখন এখানেও চূড়ান্ত প্রয়োজনীয়তা নয়keyxon=

## joins using < v1.9.6 
setkey(X, a) # absolutely required
setkey(Y, a) # not absolutely required as long as 'a' is the first column
X[Y]

## joins using v1.9.6+
X[Y, on="a"]
# or if the column names are x_a and y_a respectively
X[Y, on=c("x_a" = "y_a")]

নোট করুন যে on=যুক্তিগুলি স্পষ্টভাবে এমনকি keyedযোগদানের জন্যও নির্দিষ্ট করে দেওয়া যেতে পারে ।

একমাত্র ক্রিয়াকলাপ যা keyএকেবারে সেট করা দরকার তা হ'ল ফোভারল্যাপস () ফাংশন। তবে আমরা আরও কয়েকটি বৈশিষ্ট্য নিয়ে কাজ করছি যা হয়ে গেলে এই প্রয়োজনীয়তাটি সরানো হবে।

  • সুতরাং on=যুক্তি বাস্তবায়নের কারণ কী ?

    বেশ কয়েকটি কারণ রয়েছে।

    1. এটি দুটি ডেটা . টেবিলের সাথে জড়িত একটি অপারেশন হিসাবে অপারেশনটিকে স্পষ্টভাবে আলাদা করতে দেয় । কেবল করা X[Y]এটির পাশাপাশি আলাদা করে না, যদিও ভেরিয়েবলগুলি যথাযথভাবে নামকরণের মাধ্যমে এটি পরিষ্কার হতে পারে।

    2. এটি যে কলামগুলিতে তত্ক্ষণাত কোডটির সেই লাইনটি দেখে (এবং সংশ্লিষ্ট setkey()লাইনে ট্রেসব্যাক না করে ) যোগদান করে / সাবসেটটি সম্পাদন করা হচ্ছে তা বুঝতে সহায়তা করে ।

    3. ক্রিয়াকলাপগুলিতে যেখানে কলামগুলি রেফারেন্স অনুসারে যুক্ত বা আপডেট করা হয় , on=অপারেশনগুলি আরও বেশি পারফরম্যান্ট হয় কারণ এতে সম্পূর্ণ ডেটা প্রয়োজন হয় না just কেবলমাত্র কলাম (গুলি) যুক্ত / আপডেট করতে পুনরায় অর্ডার করার জন্য টেবিল। উদাহরণ স্বরূপ,

      ## compare 
      setkey(X, a, b) # why physically reorder X to just add/update a column?
      X[Y, col := i.val]
      
      ## to
      X[Y, col := i.val, on=c("a", "b")]

      দ্বিতীয় ক্ষেত্রে, আমাদের পুনঃক্রম করতে হয়নি। এটি যে সময় সাশ্রয়ী সেই ক্রমটি গণনা করছে না, তবে র‌্যামে শারীরিকভাবে ডেটা টেবিলটি পুনরায় সাজিয়েছে এবং এড়ানো থেকে আমরা আসল ক্রমটি ধরে রেখেছি এবং এটি অভিনয়ও কার্যকর।

    4. এমনকি অন্যথায়, আপনি যদি পুনরাবৃত্তভাবে যোগদান না করেন তবে কোনও কীড এবং অ্যাডহক যোগদানের মধ্যে কোনও পার্থক্য নেই ।

এটি প্রশ্নটির দিকে পরিচালিত করে, ডেটা.ট্যাবিলের চাবি দেওয়ার কী কী সুবিধা আছে?

  • কোনও ডেটা.ট্যাবে কি করার সুবিধা আছে?

    একটি ডেটা কী- টেবিলে রাখা কীভাবে র‌্যামের সেই কলাম (গুলি) এর উপর ভিত্তি করে এটিকে শারীরিকভাবে পুনঃক্রম করে। অর্ডার গণনা করা সাধারণত সময় সাশ্রয়ী মূল্যের অংশ নয়, বরং নিজেই পুনঃক্রম হয়। যাইহোক, একবার যখন আমরা র‍্যামে ডেটা বাছাই করি, একই গোষ্ঠীর অন্তর্ভুক্ত সারিগুলি সমস্ত র‍্যামের সাথে মিলিত হয় এবং তাই খুব ক্যাশে দক্ষ। এটি বাছাই করা যা কীড ডেটা. টেবিলগুলিতে অপারেশনকে গতি দেয়।

    সুতরাং পুরো ডেটা পুনঃক্রম করতে সময় ব্যয় হয়েছে কিনা তা নির্ধারণ করা অত্যাবশ্যক t সাধারণত, যদি না সেখানে পুনরাবৃত্তিমূলক গোষ্ঠী হয় / যোগদানের অপারেশন একই সম্পাদনা করা হচ্ছে অস্থির data.table, একটি লক্ষণীয় পার্থক্য থাকা উচিত নয়।

বেশিরভাগ ক্ষেত্রে, আর কীগুলি সেট করার দরকার নেই। on=আপনি যেটি কাজে লাগাতে চান তার সম্পাদনায় কী নাটকীয় উন্নতি না হলে আমরা যেখানেই সম্ভব ব্যবহার করার পরামর্শ দিই ।

প্রশ্ন: আপনি কি একটি তুলনায় মত কর্মক্ষমতা হবে মনে করেন অস্থির যোগদানের যদি আপনি ব্যবহার setorder()পুনর্বিন্যাস করতে data.table এবং ব্যবহার on=? আপনি যদি এতদূর অনুসরণ করে থাকেন তবে আপনার এটি নির্ধারণ করতে সক্ষম হওয়া উচিত :-)।


3
শীতল ধন্যবাদ! এখনও অবধি, আমি "বাইনারি অনুসন্ধান" আসলে কী বোঝায় তা নিয়ে ভাবিনি বা হ্যাশের পরিবর্তে এটি কেন ব্যবহৃত হয়েছিল তা সত্যই বুঝতে পারি নি।
ফ্র্যাঙ্ক

@ আরুন, DT[J(1e4:1e5)]আসলেই কি সমান DF[DF$x > 1e4 & DF$x < 1e5, ]? তুমি কি আমাকে Jবোঝাতে পার? sample(1e4, 1e7, TRUE)1e4 এর উপরে সংখ্যা অন্তর্ভুক্ত না হওয়ায় অনুসন্ধানে কোনও সারিও ফেরত আসবে না ।
ফিশট্যাঙ্ক

@ ফিশট্যাঙ্ক, এক্ষেত্রে এটি হওয়া উচিত >=এবং <=- ঠিক করা উচিত । J(এবং .) এর উপাধি list(যেমন, তারা সমতুল্য)। অভ্যন্তরীণভাবে যখন iকোনও তালিকা থাকে, তখন এটি কোনও ডেটাতে রূপান্তরিত হয় following টেবিলের পরে বাইনারি অনুসন্ধান সারি সূচকগুলি গণনা করতে ব্যবহৃত হয়। ফিক্সড 1e4করার জন্য 1e5বিশৃঙ্খলা এড়ানো। দাগ দেওয়ার জন্য ধন্যবাদ। নোট করুন যে আমরা on=কী সেট করার পরিবর্তে বাইনারি সাবসেটগুলি সম্পাদন করতে সরাসরি যুক্তি ব্যবহার করতে পারি । নতুন এইচটিএমএল ভিগনেটগুলি থেকে আরও পড়ুন । যোগদানের জন্য ভিগনেটগুলির জন্য এবং সেই পৃষ্ঠাটিতে নজর রাখুন।
অরুণ 11

সম্ভবত এটি আরও বিশদ আপডেটের জন্য যেতে পারে? "যখন প্রয়োজন" বিভাগটি পুরানো মনে হচ্ছে, যেমন
মাইকেলচিরিকো

কীটি আপনাকে কীটি ব্যবহার হচ্ছে তা বলে?
স্ক্যান

20

একটি কী মূলত একটি ডেটাসেটের একটি সূচক, যা খুব দ্রুত এবং দক্ষ বাছাই, ফিল্টার এবং ক্রিয়াকলাপে যোগদানের অনুমতি দেয়। এগুলি সম্ভবত ডেটা ফ্রেমের পরিবর্তে ডেটা টেবিলগুলি ব্যবহার করার সর্বোত্তম কারণ (ডেটা টেবিল ব্যবহারের বাক্য গঠনটি আরও বেশি ব্যবহারকারী বান্ধব, তবে কীগুলির সাথে এর কোনও যোগসূত্র নেই)।

আপনি যদি সূচিগুলি বুঝতে না পারেন তবে এটি বিবেচনা করুন: একটি ফোন বই নাম অনুসারে "ইনডেক্সড" is সুতরাং আমি যদি কারও ফোন নম্বর সন্ধান করতে চাই তবে এটি বেশ সোজা। তবে ধরুন আমি ফোন নম্বর দিয়ে অনুসন্ধান করতে চাই (উদাহরণস্বরূপ, অনুসন্ধান করুন নির্দিষ্ট ফোন নম্বরটি কার)? আমি যদি ফোন নম্বর দ্বারা ফোন বইটি "পুনরায় সূচি" না দিতে পারি তবে এটি খুব দীর্ঘ সময় নিতে পারে।

নিম্নলিখিত উদাহরণটি বিবেচনা করুন: ধরুন আমার কাছে যুক্ত তথ্য (শহর, রাজ্য, জনসংখ্যা, মধ্যম আয় ইত্যাদি) সহ মার্কিন যুক্তরাষ্ট্রে (> 33,000) এর সমস্ত জিপ কোডের একটি টেবিল, জিপ রয়েছে। যদি আমি একটি নির্দিষ্ট জিপ কোডের জন্য তথ্যটি সন্ধান করতে চাই তবে অনুসন্ধান (ফিল্টার) আমি setkey(ZIP,zipcode)প্রথমে যদি প্রায় 1000 গুণ দ্রুত হয় ।

আর একটি উপকারের সাথে যোগ দিতে হবে। ধরুন কোনওের একটি উপাত্তের টেবিলে লোক এবং তাদের জিপ কোড রয়েছে (এটিকে "পিপিএল" কল করুন) এবং আমি জিপ টেবিলের (যেমন শহর, রাজ্য এবং এই জাতীয়) তথ্য যুক্ত করতে চাই। নিম্নলিখিত কোডটি এটি করবে:

setkey(ZIP,zipcode)
setkey(PPL,zipcode)
full.info <- PPL[ZIP, nomatch=F]

এটি একটি "যোগদান" এই অর্থে যে আমি একটি সাধারণ ক্ষেত্রের ভিত্তিতে 2 টি সারণী (জিপকোড) থেকে তথ্য যোগ দিচ্ছি। খুব বড় টেবিলগুলিতে এর মতো যোগদানগুলি ডেটা ফ্রেমের সাথে অত্যন্ত ধীর এবং ডেটা টেবিলগুলির সাথে অত্যন্ত দ্রুত। একটি বাস্তব জীবনের উদাহরণে আমাকে জিপ কোডের একটি পূর্ণ টেবিলটিতে 20,000 এরও বেশি সংযুক্ত হতে হয়েছিল। ডেটা টেবিলগুলির সাথে স্ক্রিপ্টটি প্রায় 20 মিনিট সময় নেয়। চালানোর জন্য. আমি এটি ডেটা ফ্রেমের সাহায্যেও চেষ্টা করে দেখিনি কারণ এটি 2 সপ্তাহের বেশি সময় নিতে পারে।

এই প্রোগ্রামটিতে আপনি শুধু পড়তে কিন্তু উচিত অধ্যয়ন প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এবং ইন্ট্রো উপাদান। এটি প্রয়োগ করতে আপনার যদি আসল সমস্যা হয় তবে এটি উপলব্ধি করা সহজ।

[@ ফ্রাঙ্কের মন্তব্যে প্রতিক্রিয়া]

পুনরায়: বাছাই করা বনাম সূচীকরণ - এই প্রশ্নের উত্তরের উপর ভিত্তি করে , এটি উপস্থিত setkey(...)হয় যা টেবিলের কলামগুলিকে পুনরায় সাজিয়ে তোলে (উদাহরণস্বরূপ, একটি শারীরিক সাজ) এবং ডাটাবেস অর্থে কোনও সূচক তৈরি করে না। এর কিছু ব্যবহারিক নিদর্শন রয়েছে: একটি জিনিসের জন্য আপনি যদি কোনও টেবিলের মধ্যে কীটি সেট করে থাকেন setkey(...)এবং তারপরে কী কলামের কোনও মান পরিবর্তন করেন, ডেটা.ট্যাবিলটি কেবল টেবিলটিকে আর বাছাই করা হিসাবে ঘোষণা করে না ( sortedবৈশিষ্ট্যটি বন্ধ করে ); সঠিক সাজানোর ক্রম বজায় রাখতে এটি গতিশীলভাবে পুনরায় সূচী করে না (যেমনটি কোনও ডাটাবেজে ঘটে)। এছাড়াও, "কী মুছে ফেলা" ব্যবহার setky(DT,NULL)করে টেবিলটিকে আসল, অরক্রাণিত ক্রমে পুনরুদ্ধার করা হয় না

পুনরায়: ফিল্টার বনাম যোগ দিন - ব্যবহারিক পার্থক্য হ'ল ফিল্টারিং একটি একক ডেটাসেট থেকে একটি উপসেট আহরণ করে, যেখানে যোগে একটি সাধারণ ক্ষেত্রের উপর ভিত্তি করে দুটি ডেটাসেটের ডেটা একত্রিত করে। বিভিন্ন ধরণের যোগদান (অভ্যন্তরীণ, বাহ্যিক, বাম) রয়েছে। উপরের উদাহরণটি একটি অভ্যন্তরীণ যোগদান (উভয় টেবিলের সাধারণ কীগুলির সাথে কেবল রেকর্ডগুলি ফিরানো হবে), এবং এটি ফিল্টারিংয়ের সাথে অনেকগুলি মিল রয়েছে।


1
+1 টি। আপনার প্রথম বাক্যটি সম্পর্কে ... এটি ইতিমধ্যে ঠিক সাজানো হয়েছে? এবং একটি ফিল্টার (বা একটি অপারেশন যা ফিল্টারিংটিকে তার প্রথম পদক্ষেপ হিসাবে গ্রহণ করে) এর একটি বিশেষ ক্ষেত্রে যোগদান নয়? "আরও ভাল ফিল্টারিং" এর মতো পুরো সুবিধাটি যোগ করে।
ফ্র্যাঙ্ক

1
বা আরও ভাল স্ক্যান আমি মনে করি।
ভেজা পায়ে

1
ধন্যবাদ জাজহওয়ার্ড আমার পূর্ব বিশ্বাস ছিল যে বাছাই করা কীটি সেট করার সুবিধাগুলির মধ্যে ছিল না (যেহেতু আপনি যদি বাছাই করতে চান, আপনার কেবল বাছাই করা উচিত), এবং এটিও যে setkeyসারিগুলি অপরিবর্তনীয়ভাবে পুনর্বিন্যাস করে। যদি এটি কেবল প্রদর্শনের উদ্দেশ্যে হয় তবে আমি কীভাবে "সত্য" ক্রম অনুসারে প্রথম দশটি সারিটি প্রিন্ট করব (সেটাকে আগে আমি দেখেছি)? আমি নিশ্চিত setkey(DT,NULL)যে এটি না করে ... (নিয়মিত)
ফ্রাঙ্ক

... (নিয়মিত) এছাড়াও, আমি প্যাকেজের কোডটি দেখিনি, তবে যোগদান X[Y,...]করতে আপনাকে কী ব্যবহার করে এক্স এর সারিগুলি "ফিল্টার" করতে হবে। মঞ্জুরিপ্রাপ্ত, এর পরে অন্যান্য জিনিসগুলি ঘটে (ওয়াই এর কলামগুলি উপলব্ধ করা হয়, এবং বাইরের বাইরের একটি অন্তর্নিহিত থাকে) তবে আমি এখনও এটি ধারণামূলক স্বতন্ত্র সুবিধা হিসাবে দেখতে পাই না। আমার অনুমান যে আপনার উত্তরটি অপারেশনগুলির ক্ষেত্রে রেখে দেওয়া যেতে পারে আপনি যা করতে চাইতে পারেন, যদিও, যেখানে পার্থক্যটি সহায়ক হতে পারে।
ফ্র্যাঙ্ক

1
@ ফ্র্যাঙ্ক - সুতরাং setkey(DT,NULL)কীটি সরিয়ে দেয় তবে বাছাইয়ের ক্রমকে প্রভাবিত করে না। এখানে এই সম্পর্কে একটি প্রশ্ন উত্থাপন । দেখা যাক.
jlhoward
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.