2012-08-25 21 views
26

मेरे पास प्रति दिन मुठभेड़ों के लिए enc.per.day नामक डेटा.table है। इसमें 2403 पंक्तियां हैं जिनमें सेवा की तारीख निर्दिष्ट है और उस दिन देखे गए मरीजों की संख्या। मैं किसी भी प्रकार के सप्ताहांत पर देखे गए मरीजों की औसत संख्या देखना चाहता था।मध्यस्थ डेटाटेबल यात्रा क्यों करता है (पूर्णांक बनाम पूर्णांक)?

enc.per.day[,list(patient.encounters=median(n)),by=list(weekdays(DOS))] 

कि लाइन एक त्रुटि,, सूची (patient.encounters = मंझला (एन)) [.data.table (enc.per.day में

त्रुटि देता है,: j की स्तंभों का मूल्यांकन नहीं है प्रत्येक समूह के लिए लगातार प्रकार के लिए: समूह 4 के लिए परिणाम स्तंभ 1 प्रकार 'पूर्णांक' लेकिन उम्मीद प्रकार 'डबल'

सभी काम अच्छी तरह से

निम्नलिखित है

क्या चल रहा है? मुझे यह पता लगाने में काफी समय लगा कि मेरा कोड क्यों काम नहीं करेगा।

वैसे अंतर्निहित वेक्टर enc.per.day $ n एक पूर्णांक

storage.mode(enc.per.day$n) 

रिटर्न "पूर्णांक" है। इसके अलावा, डेटाटेबल में कहीं भी एनएएस नहीं हैं।

उत्तर

37

टीएल, डॉ as.double()

median() के साथ रैप mediandata.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))) टाइप करके देख सकते हैं।)

+1

@Matthew Dowle - के बारे में कैसे उन विवरण जोड़ने के लिए धन्यवाद * * data.table ** परिणाम वेक्टर के लिए स्थान प्रारंभ और आवंटित करता है। –

+0

क्या मूल्य के समान प्रकार के औसत को हवा करना संभव है? इसलिए यदि मेरे पास वैल्यू = 1,1,1,2,2,2,2 जैसे मूल्य होंगे तो इसका परिणाम औसत नहीं होगा 1.5। इसके बजाय इसे औसत = 2 दिखाना चाहिए। – lony

+0

ऊपर दिए गए सुझाव के उदाहरण के रूप में, यह डीटी [, सी (as.double (lapply (.SD, median)), .N), = x, .SDcols = c ("x", "y "," z ")] डीटी [, सी (लापरवाही (एसएसडी, औसत), एन) द्वारा = x, .SDcols = c (" x "," y "," z ")] –

संबंधित मुद्दे