2013-08-20 6 views
9

सेट करते समय डेटाटेबल तारों को कैसे व्यवस्थित करता है कल मुझे अपने कोड में एक बग खोजने की कोशिश करने में कुछ समय व्यतीत करना पड़ा और मैंने पाया कि data.table पैकेज आधार से थोड़ा अलग तरीके से तारों को व्यवस्थित करता है। क्या यह एक सामान्य व्यवहार है और आधार order फ़ंक्शन के साथ प्राप्त परिणामों को पुन: उत्पन्न करने के लिए सबसे प्रभावी तरीका (जिसमें data.table का लाभ है) क्या है? यहाँ एक खिलौना प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है:कुंजी

library(data.table) 
options(stringsAsFactors = FALSE) 

d <- data.frame(cn=c("USA","Ubuntu","Uzbekistan")) 
d[order(d$cn),,drop=F] 

#   cn 
#2  Ubuntu 
#1  USA 
#3 Uzbekistan 

dt <- data.table(d) 
setkey(dt, cn) 
dt 

#   cn 
#1:  USA 
#2:  Ubuntu 
#3: Uzbekistan 

options(stringsAsFactors = default.stringsAsFactors()) 

ओएस विंडोज 7

+0

आपका ओएस क्या है? – GSee

+0

मेरा ओएस विंडोज 7 – jem77bfp

उत्तर

9

अद्यतन मार्च 2014

इस एक के बारे में कुछ बहस हुई है। V1.9.2 के रूप में हम अब सी 0 लोकेल का उपयोग करके setkey सॉर्टिंग पर बस गए हैं; उदाहरण के लिए, उपयोगकर्ता के लोकेल के बावजूद, सभी पूंजी पत्र सभी निचले केस अक्षरों से पहले आते हैं। यह v1.8.8 में किया गया एक बदलाव था जिसे हम रिवर्स करना चाहते थे लेकिन अभी के लिए अटक गए हैं।

save() पर विचार करें- अपने लोकेल में एक कुंजी वाली तालिका और एक सहकर्मी load() - इसे एक अलग लोकेल में रखें। जब वे उस तालिका में शामिल होते हैं तो यह लोकल क्रमबद्ध क्रम में सही ढंग से काम नहीं कर सकता है। setkey स्थानीय स्तर पर ऑर्डर करने के साथ लोकेल नाम को सहेजने की अनुमति देने के लिए हमें थोड़ा और सावधानी से सोचना है, इसलिए data.table कम से कम तुलना कर सकते हैं और पता लगा सकते हैं कि वर्तमान लोकेल उस दौड़ के लिए अलग है या नहीं setkey

यह गति कारणों के लिए भी है क्योंकि लोकेल के अनुसार सॉर्टिंग सी लोकेल की तुलना में बहुत धीमी है। हालांकि, हम इसे यथासंभव कुशलतापूर्वक कर सकते हैं और वैकल्पिक रूप से आदर्श होने की अनुमति दे सकते हैं।

इसलिए, अब यह एक सुविधा अनुरोध है और आगे की टिप्पणियों का बहुत स्वागत है।

FR#4842 setkey to sort using session's locale not C locale



अच्छा पकड़! बदले में setkey पर कॉल setkeyv पर कॉल करता है और कॉलम/प्रविष्टियों को "ऑर्डर" करने के लिए fastorder पर कॉल करता है जो बदले में chorder पर कॉल करता है।

chorder बदले में एक सी फ़ंक्शन Ccountingcharacter.c कॉल करता है। अब, मुझे लगता है कि समस्या "लोकेल" के कारण आती है।

चलो देखते हैं कि मैं अपने मैक पर "लोकेल" क्या हूं।

x <- c("USA", "Ubuntu", "Uzbekistan") 
order(x) 
# [1] 2 1 3 

अब, चलो "स्थान" के लिए 'सी' को बदलने:

Sys.getLocale() 
# [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8" 

अब देखते हैं कैसे order प्रकार यह करते हैं।

Sys.setlocale("LC_ALL", "C") 
# [1] "C/C/C/C/C/en_US.UTF-8" 

order(x) 
# [1] 1 2 3 

?order से:

चरित्र वैक्टर के लिए सॉर्ट क्रम प्रयोग में वातावरण की collating अनुक्रम पर निर्भर करेगा: Comparison देखते हैं।

?Comparison से:

चरित्र वैक्टर में तार की तुलना में उपयोग में स्थान की collating अनुक्रम का उपयोग तार के भीतर कोषगत है: स्थानों देखते हैं। En_US जैसे स्थानीय लोगों का कोलाटिंग अनुक्रम सामान्य रूप से सी से अलग होता है (जिसे ASCII का उपयोग करना चाहिए) और आश्चर्यजनक हो सकता है। संयोजन आदेश के बारे में कोई धारणा बनाने से सावधान रहें: उदा। जेड के बाद, एक भी पत्र के रूप में डेनिश आ प्रकार में ....

तो, मूल रूप से, order रूप में अच्छी तरह के तहत "- में एस्टोनियाई जेड एस और टी के बीच आता है, और मिलान जरूरी चरित्र-दर-चरित्र नहीं है सी "लोकेल, data.table के setkey के समान आदेश देता है। मेरा अनुमान है कि chorder द्वारा बुलाया गया सी-फ़ंक्शन स्वचालित रूप से सी-लोकेल पर चलता है जो "एस" से पहले "एस" आने से पहले एसीआई मानों की तुलना करेगा।

यह संभवतः @ मैथ्यूडॉवेल के ध्यान में लाने के लिए महत्वपूर्ण है (यदि वह पहले से ही इसके बारे में नहीं जानता है)। तो, मैं सुझाव दूंगा कि आप इसे here (बस सुनिश्चित करने के लिए) के रूप में फ़ाइल करें।

+0

+1 अच्छा जांचत्मक काम –

+0

अच्छी नौकरी, लेकिन मैं इसे एक बग नहीं कहूंगा, शायद एक फीचर अनुरोध – eddi

2

ठीक है, मुझे यकीन है कि क्या सबसे कारगर तरीका है, लेकिन आप data.frame परिणाम पुन: पेश करने निम्न कर सकते हैं नहीं कर रहा हूँ।

dt[order(dt$cn)] 

      cn 
1:  Ubuntu 
2:  USA 
3: Uzbekistan 
+1

यह ठीक काम करता है, लेकिन बड़े डेटा सेट के साथ यह सेटकी – jem77bfp

+0

से बहुत धीमी हो सकती है। ऐसा लगता है कि इसे सेटकी में उपयोग की जाने वाली सॉर्ट विधि के साथ कुछ करना पड़ सकता है। यह है कि यह सेटकी में क्या कहता है (हालांकि मुझे सेटकी में सॉर्ट विधि सेट करने का विकल्प नहीं मिला) _ सॉर्ट को sort.list में बहुत तेज "रेडिक्स" विधि के साथ प्रयास किया जाता है। अगर यह विफल हो जाता है, तो क्रम क्रम में डिफ़ॉल्ट विधि में बदल जाता है। उस तर्क को कॉलम द्वारा दोहराया गया कॉलम है ._ शायद कोई और जानता है? –