टीएल, डॉ as.double()
median()
के साथ रैप median
data.table 'ऊपर यात्राएं' क्योंकि --- तब भी जब केवल पूर्णांक वैक्टर पारित कर दिया --- median()
कभी कभी एक पूर्णांक मान देता है, और कभी कभी एक डबल रिटर्न ।
## median of 1:3 is 2, of type "integer"
typeof(median(1:3))
# [1] "integer"
## median of 1:2 is 1.5, of type "double"
typeof(median(1:2))
# [1] "double"
एक न्यूनतम उदाहरण के साथ अपने त्रुटि संदेश Reproducing:
library(data.table)
dt <- data.table(patients = c(1:3, 1:2),
weekdays = c("Mon", "Mon", "Mon", "Tue", "Tue"))
dt[,median(patients), by=weekdays]
# Error in `[.data.table`(dt, , median(patients), by = weekdays) :
# columns of j don't evaluate to consistent types for each group:
# result for group 2 has column 1 type 'double' but expecting type 'integer'
data.table शिकायत क्योंकि, पहले समूह का मूल्य निरीक्षण संसाधित करने के लिए के बाद, यह निष्कर्ष निकाला है कि, ठीक है, ये परिणाम "पूर्णांक" प्रकार के होने जा रहे हैं। लेकिन फिर तुरंत (या समूह 4 में आपके मामले में), यह "डबल" प्रकार का मान पास हो जाता है, जो इसके "पूर्णांक" परिणाम वेक्टर में फिट नहीं होगा।
data.table बजाय समूह के लिहाज से गणना के अंत तक परिणाम जमा कर सकता है, और उसके बाद प्रकार रूपांतरण प्रदर्शन यदि आवश्यक हो, लेकिन यह है कि अतिरिक्त प्रदर्शन अपमानजनक भूमि के ऊपर का एक समूह की आवश्यकता होगी; इसके बजाए, यह सिर्फ रिपोर्ट करता है कि क्या हुआ और आपको समस्या को ठीक करने देता है। पहले समूह के चलने के बाद, और यह परिणाम के प्रकार को जानता है, यह उस प्रकार के परिणाम वेक्टर आवंटित करता है जब तक कि समूहों की संख्या, और फिर इसे पॉप्युलेट करता है। यदि बाद में यह पता चलता है कि कुछ समूह 1 से अधिक आइटम लौटाते हैं, तो यह बढ़ेगा (यानी पुन: आवंटित) जिसके परिणामस्वरूप वेक्टर आवश्यक हो। ज्यादातर मामलों में, परिणाम के अंतिम आकार के लिए data.table
का पहला अनुमान सही है (उदाहरण के लिए, प्रति समूह 1 पंक्ति परिणाम) और इसलिए तेज़।
इस मामले में, का उपयोग median(X)
के बजाय एक उपयुक्त फिक्स प्रदान करता है।
(वैसे, अपने संस्करण का उपयोग कर round()
काम किया है क्योंकि यह हमेशा प्रकार के मूल्यों "डबल" देता है, जैसा कि आप typeof(round(median(1:2))); typeof(round(median(1:3)))
टाइप करके देख सकते हैं।)
@Matthew Dowle - के बारे में कैसे उन विवरण जोड़ने के लिए धन्यवाद * * data.table ** परिणाम वेक्टर के लिए स्थान प्रारंभ और आवंटित करता है। –
क्या मूल्य के समान प्रकार के औसत को हवा करना संभव है? इसलिए यदि मेरे पास वैल्यू = 1,1,1,2,2,2,2 जैसे मूल्य होंगे तो इसका परिणाम औसत नहीं होगा 1.5। इसके बजाय इसे औसत = 2 दिखाना चाहिए। – lony
ऊपर दिए गए सुझाव के उदाहरण के रूप में, यह डीटी [, सी (as.double (lapply (.SD, median)), .N), = x, .SDcols = c ("x", "y "," z ")] डीटी [, सी (लापरवाही (एसएसडी, औसत), एन) द्वारा = x, .SDcols = c (" x "," y "," z ")] –