मैं अपनी तालिका में पंक्तियों को एक वर्ण चर (stage मेरे उदाहरण में) के अनुसार पुन: व्यवस्थित करना चाहता हूं। अगर मैं पहले वांछित क्रम (order(dt1$stage)) को एक चर में सहेजता हूं और फिर इसे dt1[myorder, stage] के रूप में लागू करता हूं - यह ठीक काम करता है। लेकिन जब मैं एक ही इनलाइन करने की कोशिश करता हूं, जैसे dt1[order(dt1$stage), ], तो ऑर्डर अलग होता है! कुछ बहुत ही बुनियादी होना चाहिए जो मुझे याद आ रही है ...

dt1 <- fread('
id stage pos
 1 I       1
 2 II      2
 3 III     5
 4 IV      6
 5 IIa     3
 6 IIb     7
 7 IIIa    8
 8 IIIb    4
 9 IVa     9
10 IVb    10')

sort(dt1$stage) # OK
# I II IIa IIb III IIIa IIIb IV IVa IVb

myorder <- order(dt1$stage)
dt1[myorder         , stage] # OK
# I II IIa IIb III IIIa IIIb IV IVa IVb

dt1[order(dt1$stage), stage] # different!
# I II III IIIa IIIb IIa IIb IV IVa IVb
2
Vasily A 24 पद 2020, 02:20

1 उत्तर

सबसे बढ़िया उत्तर

यह base::order के बजाय fast order कर रहा है। ?data.table::order के अनुसार

ध्यान दें कि x[order(.)] जैसे प्रश्नों को data.table के तेज क्रम का उपयोग करने के लिए आंतरिक रूप से अनुकूलित किया गया है।

यह भी ध्यान दें कि data.table हमेशा "सी-लोकेल" में पुन: व्यवस्थित होता है (विवरण देखें)। सत्र लोकेल के आधार पर छाँटने के लिए, x[base::order(.)] का उपयोग करें।

data.table अपने स्वयं के तेज़ मूलांक-आधारित क्रम को लागू करता है।

data.table हमेशा "सी-लोकेल" में पुन: व्यवस्थित होता है। एक परिणाम के रूप में, आदेश आधार :: आदेश द्वारा प्राप्त से भिन्न हो सकता है। अंग्रेजी लोकेल में, उदाहरण के लिए, सी-लोकेल में सॉर्टिंग केस-संवेदी है। इस प्रकार, सॉर्टिंग c("c", "a", "B") data.table में c("B", "a", "c") देता है लेकिन c("a", "B", "c" ) आधार में :: ord

अगर हम sort को base से दोहराना चाहते हैं, तो base::order का उपयोग करें

dt1[base::order(stage)]$stage
#[1] "I"    "II"   "IIa"  "IIb"  "III"  "IIIa" "IIIb" "IV"   "IVa"  "IVb" 
2
akrun 24 पद 2020, 02:28
1
बहुत बहुत धन्यवाद, अब यह स्पष्ट है! इसलिए, अगर मैं setorder(dt1, stage) के बजाय पूरी तालिका को पुन: व्यवस्थित करना चाहता हूं, तो मुझे dt1 <- dt1[base::order(stage),] का उपयोग करना चाहिए, है ना?
 – 
Vasily A
24 पद 2020, 02:30
हाँ, लेकिन यह बड़े डेटासेट के लिए setorder की तुलना में धीमा हो सकता है
 – 
akrun
24 पद 2020, 02:31