সারিগুলি ডেটাতে সাজান string স্ট্রিং কী-অর্ডার (-x, v) এর ক্রম হ্রাসে টেবিল data ডেটাতে ত্রুটি দেয় t


125

ধরা যাক আমার নিম্নলিখিতগুলি data.tableরয়েছে R:

  library(data.table)
  DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)

আমি এটি দুটি কলাম দ্বারা কলাম করতে চান (কলাম xএবং বল v)। আমি এটি ব্যবহার করেছি:

 DT[order(x,v)] # sorts first by x then by v (both in ascending order)

তবে এখন, আমি এটি অনুসারে বাছাই করতে চাই x(ক্রম হ্রাসে) এবং নিম্নলিখিত কোডটি পেতে:

  DT[order(-x)] #Error in -x : invalid argument to unary operator

অতএব, আমি মনে করি যে এই ত্রুটিটি সত্য কারণেই class(DT$x)=character। এই সমস্যাটি সমাধান করার জন্য আপনি আমাকে কোনও পরামর্শ দিতে পারেন?

আমি জানি যে আমি ব্যবহার করতে পারি DT[order(x,decreasing=TRUE)]তবে একই সাথে উভয় উপায়ে (কিছু হ্রাস, কিছু বাড়ছে) ব্যবহার করে বেশ কয়েকটি কলাম অনুসারে বাছাই করতে সিনট্যাক্সটি জানতে চাই।

মনে রাখবেন যে আপনি যদি DT[order(-y,v)]ফলাফলটি ব্যবহার করেন ঠিক আছে তবে আপনি যদি ব্যবহার DT[order(-x,v)]করেন তবে একটি ত্রুটি রয়েছে। সুতরাং, আমার প্রশ্ন: এই ত্রুটিটি কীভাবে সমাধান করবেন?


6
আকর্ষণীয় প্রশ্ন, তবে আপনি যদি বড় ডেটা সেট নিয়ে কাজ করছেন তবে আপনার ডেটা. টেবিলগুলির জন্য সম্ভবত আপনার কীগুলি সেট করা উচিত। কীগুলি আপনার ডেটাটিকে এমন ক্রমে রাখে যা পরবর্তী সূচী, উপসেটিং, সমষ্টি-দ্বারা-গ্রুপগুলি ইত্যাদিকে সর্বাধিক করে তোলে যা ডেটা প্রিন্ট করার জন্য এটি আপনার পছন্দসই বিন্যাস হতে পারে না তবে এটি আপনাকে যে গতি অর্জন করবে তার গতির জন্য প্রায়শই এটির জন্য একটি ছোট মূল্য দেওয়া উচিত it's ।
জোশ

যাইহোক, এটি আমার কাছে উপস্থিত হয়ে দেখা যায় যে DT[order(-x)]এটি একটি সমতুল্য বক্তব্য নয় setorder(DT, -x)কারণ setorder()আসলে কাজ করে DTযখন অন্যটি তা করে না। সমতুল্য বিবৃতিগুলি হবে ডিটি <- ডিটি [অর্ডার (-x)] সেটর্ডার (ডিটি, -x) আমি আর এ খুব নতুন তাই ভুল হয়ে থাকলে দয়া করে সঠিক করুন।
জেরোম রিসার্চ

@ জেরোম আপনি সঠিক আছেন পানকিল তাদের সমতুল্য বলে দেয়নি, তাই আমার ধারণা এটি ঠিক আছে।
ফ্রাঙ্ক

1
আমি @ এসএমসি এর সাথে একমত যে শিরোনাম সম্পাদনাটি এখানে অর্থবোধ করে, যদিও আমি এটি পরিবর্তন করে বলব যে এই প্রশ্নটি আর প্রাসঙ্গিক নয়, যেমন শিরোনামে "ডেটা.ট্যাবিলিটেড 1.9.4 বা তার আগের" যোগ করে যাতে লোকেরা না করে গুগল থেকে অন্য কিছু প্রত্যাশা করে এখানে অবতরণ চালিয়ে যান। আমি আমার এক প্রশ্নের সাথে এটি করেছি stackoverflow.com/questions/30035939/…
ফ্রাঙ্ক

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

উত্তর:


144

হালনাগাদ

data.table v1.9.6 + এখন ওপির আসল প্রয়াসকে সমর্থন করে এবং নিম্নলিখিত উত্তর আর প্রয়োজন নেই।


আপনি ব্যবহার করতে পারেন DT[order(-rank(x), y)]

   x y v
1: c 1 7
2: c 3 8
3: c 6 9
4: b 1 1
5: b 3 2
6: b 6 3
7: a 1 4
8: a 3 5
9: a 6 6

1
নীচে @ পঙ্কিলশাহ দ্বারা চিহ্নিত হিসাবে কিছু সময়ের জন্য স্থির করা হয়েছে এবং ওপির আসল পদ্ধতির প্রত্যাশা অনুযায়ী এখন কাজ করে। এটি সি স্তরে স্থির হওয়ার পরে আমি প্রতিশ্রুতিটি খুঁজে পেলাম না এবং কী অনুসন্ধান করব তা আমি জানি না।
মাইকেলচিরিকো

1
শীতল ধন্যবাদ. মনে হয় না যে এখানে কেউ শেষ হবে ... তবে অন্যদিকে আমি নিজে এখানে অস্পষ্টভাবে সম্পর্কিত কিছু গুগল করে শেষ করেছি।
মাইকেলচিরিকো

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

প্রকৃত প্রকাশের সংখ্যাটি (1.9.6?) উল্লেখ করা এটি খুব দরকারী, সুতরাং আমাদের NEWS.md এর সংরক্ষণাগারগুলিতে খোঁজ করতে হবে না
smci

23

আপনি কেবলমাত্র -সংখ্যার এন্ট্রিগুলিতে ব্যবহার করতে পারেন, তাই আপনি ক্রমবর্ধমান ক্রমে আপনি যেটি চান তা হ্রাস করতে এবং এটিকে অবহেলা করতে পারেন:

DT[order(x,-v,decreasing=TRUE),]
      x y v
 [1,] c 1 7
 [2,] c 3 8
 [3,] c 6 9
 [4,] b 1 1
 [5,] b 3 2
 [6,] b 6 3
 [7,] a 1 4
 [8,] a 3 5
 [9,] a 6 6

3
আমি এই পদ্ধতিটি পছন্দ করি, যদি না আপনার দুটি characterকলাম থাকে এবং আপনি একটি ক্রমবর্ধমান এবং অন্যটি হ্রাস করতে চান না।
ম্যাথু প্লোরডে

1
@ এমপ্লোরডে আমি মনে করি আপনি যে সমস্যার সমাধান করেছেন তা মোকাবেলায় আপনি এই সমাধানের সাথে সমাধান করতে পারেন। উদাহরণস্বরূপ, আপনি রাখতে পারেন: DT[order(x,-rank(w),decreasing=TRUE)]প্রদত্ত xএবং wউভয় অক্ষর কলাম। ধন্যবাদ!
nhern121

17

DT[order(-x)]প্রত্যাশার মতো কাজ করে। আমার ডেটা.ট্যাবল সংস্করণ 1.9.4 আছে। সম্ভবত এটি সাম্প্রতিক সংস্করণে স্থির হয়েছিল।
এছাড়াও, আমি সেট * কমান্ডের মতো setorder(DT, -x)সিনট্যাক্সের পরামর্শ দিচ্ছি ,setnamessetkey

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