2013-08-28 4 views
5

मेरे पास डेटा डेटा है (चलिए इसे माइडाटा कहते हैं) निम्न डेटा फ्रेम के साथ।आर "बाय" फ़ंक्शन के साथ ऑर्डरबुक के साथ कैसे काम करें?

datetime|side(0=Bid,1=Ask)| distance(1:best price, 2: 2nd best, etc.)| price 
2008/01/28,09:11:28.000,0,1,1.6066 
2008/01/28,09:11:28.000,0,2,1.6065 
2008/01/28,09:11:28.000,0,3,1.6064 
2008/01/28,09:11:28.000,0,4,1.6063 
2008/01/28,09:11:28.000,0,5,1.6062 

2008/01/28,09:11:28.000,1,1,1.6067 
2008/01/28,09:11:28.000,1,2,1.6068 
2008/01/28,09:11:28.000,1,3,1.6069 
2008/01/28,09:11:28.000,1,4,1.6070 
2008/01/28,09:11:28.000,1,5,1.6071 

मैं इस मामले में minAsk-maxBid की गणना करना चाहता हूं, इस मामले में = 1.6067-1.6066। मैं इसे अपने पूरे डेटा के लिए करना चाहता हूं। , एक्स [[1L]] मज़ा करने में त्रुटि (...: मैं का उपयोग कर सोच रहा था "द्वारा" लेकिन फिर भी इस सरल कोड का उपयोग:

by(mydata,mydata$datetime, min(mydata$price)) 

प्रत्येक ब्लॉक मैं निम्नलिखित त्रुटि मिलती है में सिर्फ न्यूनतम मूल्य को खोजने के लिए): फ़ंक्शन "FUN" नहीं मिला

कोई विचार यह कैसे कार्यान्वित किया जाए? क्या मुझे शायद एक अलग फ़ंक्शन ddply का उपयोग करना चाहिए?

+1

यदि आपने "दूरी" क्या तुम सच में न्यूनतम/अधिकतम जरूरत नहीं है, आप केवल 'दूरी == 1'' शामिल करने के लिए सबसेट कर सकते हैं। वास्तव में, यदि आपका डेटा साफ़ है, और प्रसार कभी पार नहीं हुआ है, तो आप केवल कीमतों के अंतर के 'abs' ले सकते हैं जहां प्रत्येक समय दूरी == 1 है। – GSee

+0

यदि आप अपना डेटा पुन: उत्पन्न करते हैं तो आपको सबसे अच्छे उत्तर मिलेंगे। इस मामले में, यदि आपने अभी अपने प्रश्न में 'dput (mydata) 'का आउटपुट प्रदान किया है, तो आपको बेहतर उत्तर मिलेंगे। ध्यान दें कि आपके द्वारा दिखाए गए दिनांक में दिनांक और समय के लिए अलग-अलग कॉलम हैं, लेकिन आपको वास्तव में एक डेटाटाइम कॉलम (शायद POSIXct) का उपयोग करना चाहिए। – GSee

+0

@ जीएसआई- मेरे पास कॉलम में मेरा डेटा था। मैं दूसरे जवाब में समाधान के साथ जाऊंगा क्योंकि एक विशाल डेटा में उप सेटिंग कुशल नहीं है। अधिक जानकारी पोस्ट करने के बारे में अंक के लिए धन्यवाद, मैं यहां नया हूं और मैं उस समय से ऐसा करूँगा। – mitra

उत्तर

3

आप by गलत आवश्यक आदानों दे रहे हैं की कोशिश करो। आप की तरह कुछ की जरूरत है:

by(mydata,mydata$datetime, function(x) min(x$price)) 
#mydata$datetime: 2008/01/28,09:11:28.000 
#[1] 1.6062 

?by देखें - यह सबसे बुनियादी by की आदानों लेता है पर ...

by(data, INDICES, FUN) 

समारोह FUN के रूप में निर्दिष्ट data.frame की एक पूरी सबसेट पर लागू होता है data। अर्थात। यदि आप identityFUN फ़ंक्शन के रूप में उपयोग करते हैं, तो INDICES द्वारा परिभाषित प्रत्येक सबसेट वापस कर दिया जाएगा। प्रयास करें:

by(mydata,mydata$datetime, identity) 

इसलिए, आप बस सीधे min(mydata$price) के लिए पूछ नहीं सकते हैं, आप सबसेट के भीतर price चर के min के लिए पूछने की जरूरत है। आप के रूप में अपने मूल जवाब पूरे अक्षरों में लिखावट लिख सकता है ...

by(mydata,mydata$datetime, function(subdataset) min(subdataset$price)) 

अपना पूरा समस्या को यह विस्तार करने के लिए, आप की तरह कुछ कर सकते हैं:

by(
    mydata, 
    mydata$datetime, 
    function(x) min(x$price[x$side==1]) - max(x$price[x$side==0]) 
) 
#mydata$datetime: 2008/01/28,09:11:28.000 
#[1] 1e-04 

भविष्य में संदर्भ के लिए, यह करने के लिए सिद्धांत रूप में बहुत समान है data.table पैकेज जिस तरह से by= तर्क और उसके .SD (उप-डेटा) कोड के साथ संचालित होता है। इस मामले में एक data.table जवाब यद्यपि भी सरल है:

mydt <- as.data.table(mydata) 

mydt[,min(price[side==1]) - max(price[side==0]),by=datetime] 
#     datetime V1 
#1: 2008/01/28,09:11:28.000 1e-04 

mydt[,list(minmax=min(price[side==1]) - max(price[side==0])),by=datetime] 
#     datetime minmax 
#1: 2008/01/28,09:11:28.000 1e-04 
+2

'data.table' दृष्टिकोण को' .SD' की आवश्यकता नहीं है।'mydt [, min (price), द्वारा = डेटाटाइम]' पर्याप्त है और पसंदीदा – mnel

+0

@mnel - damn, आप सही हैं - जो 'by' और' .SD' के बीच मेरे समानता को कमजोर करता है ;-) – thelatemail

+0

महान बिंदु, मैंने डेटाटेबल का उपयोग किया है, मुझे नहीं पता था कि यह अलग है। यह तब क्यों काम नहीं कर रहा है: mydt [, (min (price [side == 1]) - अधिकतम (मूल्य [पक्ष == 0])), द्वारा = डेटाटाइम] – mitra

4

by(mydata,mydata$datetime, function(d)with(d, min(price[side==1])-max(price[side==0]))) 
संबंधित मुद्दे