डेटा में पंक्तियों को क्रमबद्ध करें। स्ट्रिंग कुंजी पर घटते क्रम में `ऑर्डर (-x, v)` डेटा पर त्रुटि देता है। 1.9.4% पहले


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
दिलचस्प सवाल है, लेकिन अगर आप बड़े डेटा सेट के साथ काम कर रहे हैं, तो आपको अपने डेटा के लिए कुंजी सेट करना चाहिए। कुंजी एक आदेश बाद में होने वाली अनुक्रमण अधिकतम, subsetting में अपने डेटा डाल दिया, एकत्रीकरण-दर-समूह आदि यही कारण है कि हो सकता है डेटा मुद्रण के लिए अपना पसंदीदा प्रारूप नहीं हो, लेकिन अक्सर यह गति यह आप प्राप्त करेंगे के लिए भुगतान करने के लिए एक छोटी सी कीमत है ।
जोश ओ'ब्रायन 16

हालाँकि, यह मुझे प्रतीत होता है कि DT[order(-x)]यह एक समकक्ष कथन नहीं है setorder(DT, -x)क्योंकि setorder()वास्तव में कार्य करता है DTजबकि दूसरा नहीं करता है। समतुल्य कथन DT <- DT [आदेश (-x)] सेटऑर्डर (DT, -x) होगा I R के लिए मैं बहुत नया हूं इसलिए यदि मैं गलत हूं तो कृपया सही करें।
jeromeResearch

@ जेरोम आप सही हैं। पंकिल ने यह नहीं कहा कि वे समकक्ष थे, इसलिए मुझे लगता है कि यह ठीक है जैसा कि है।
फ्रैंक

1
मैं @smci से सहमत हूं कि एक शीर्षक संपादित यहां समझ में आता है, हालांकि मैं इसे इंगित करने के लिए बदल दूंगा कि यह सवाल अब प्रासंगिक नहीं है, उदाहरण के लिए "data.table 1.9.4 या इससे पहले" शीर्षक में जोड़कर ताकि लोग ऐसा न करें। Google से यहां लैंडिंग जारी रखें कुछ और की उम्मीद है। मैंने अपने सवालों में से एक के साथ ऐसा किया है stackoverflow.com/questions/30035939/…
फ्रैंक

1
Nestorggh, कृपया नए शीर्षक को रोलबैक न करें जब तक कि आप इसे सुधार नहीं सकते। "data.table में पंक्तियों को क्रमबद्ध करें" लगभग कुछ भी नहीं कहा, कि बुनियादी कार्यक्षमता yonks के लिए थी। शीर्षक को आपके वास्तविक मुद्दे का उल्लेख करने की आवश्यकता है (कई कुंजियाँ जहां एक डीआरआर क्रम है)। यह भी महत्वपूर्ण है कि यह 1.9.4 और पूर्व में एक ज्ञात मुद्दा था और अब यह एक मुद्दा नहीं है।
२३'१18

जवाबों:


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
जैसा कि नीचे @PankilShah द्वारा बताया गया है कि कुछ समय के लिए तय किया गया है और ओपी का मूल दृष्टिकोण अब उम्मीद के मुताबिक काम करता है। जब से यह C स्तर पर तय किया गया था, तब मुझे यह पता नहीं चल पाया था और मुझे नहीं पता कि मुझे क्या खोजना है।
माइकलचिरिको

1
धन्यवाद। ऐसा लगता है कि किसी को भी यहाँ समाप्त होगा कि संभावना नहीं है ... लेकिन दूसरी ओर मैं खुद को यहाँ कुछ अस्पष्ट से googling से समाप्त हो गया।
माइकलचिरिको

@MichaelChirico वास्तव में, मैं नियमित रूप से इस उत्तर के लिए वोट प्राप्त करता हूं, इसलिए मुझे खुशी है कि आपने इसे इंगित किया है। मैं वास्तव में एक data.table उपयोगकर्ता नहीं हूँ और इसके विकास के साथ नहीं रहा हूँ ।
मैथ्यू प्लोरड

वास्तविक रिलीज़ नंबर (1.9.6?) बताना बहुत उपयोगी है, इसलिए हमें NEWS.md के संग्रह में शिकार करने की आवश्यकता नहीं है ।
मुस्कान

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
@mplourde मुझे लगता है कि आप इस समस्या से निपटने के लिए अपने समाधान को एक साथ जोड़ सकते हैं। उदाहरण के लिए, आप डाल सकते हैं: जो DT[order(x,-rank(w),decreasing=TRUE)]दिए गए हैं xऔर wदोनों वर्ण स्तंभ हैं। धन्यवाद!
nhern121

17

DT[order(-x)]उम्मीद के मुताबिक काम करता है। मेरे पास डेटाटेबल संस्करण 1.9.4 है। शायद यह एक हालिया संस्करण में तय किया गया था।
इसके अलावा, मैं सेट * कमांड setorder(DT, -x)को ध्यान में रखते हुए सिंटैक्स का सुझाव देता हूं , जैसे ,setnamessetkey

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.