2011-08-28 9 views
6

(दुर्भाग्य से, मैं बुनियादी शब्दावली मेरे सवाल तैयार करने के लिए याद आ रही है। तो, कृपया मुझे सही करें जहां अधिक सटीक शब्दों उपयोगी होते हैं।),डेटा बिंदुओं के अनुपात की गणना कैसे करें, यानी, कुछ मानदंडों के आधार पर उन्हें संयोजित करें?

मैं आर का उपयोग आभासी मशीनों की बेंचमार्क परिणामों के लिए बहुत ही बुनियादी सांख्यिकीय विश्लेषण करने के लिए और मैं अक्सर कुछ मानदंडों के आधार पर मेरे डेटा को सामान्य बनाना चाहते हैं।

normalized_data <- ddply(bench, ~ Benchmark + Configuration + Approach, 
         transform, 
         Ratio = Time/Time[Approach == "appr2"]) 

तो, क्या मैं वास्तव में चाहते हैं इसी माप के जोड़ों के बीच गति-अप की गणना करने के लिए है:

वर्तमान में मेरी समस्या यह है कि मैं काम करने के लिए निम्नलिखित की तरह कुछ चाहते हैं।

bench कॉलम समय, बेंचमार्क, कॉन्फ़िगरेशन और दृष्टिकोण के साथ एक डेटा फ्रेम है और इसमें बेंचमार्क, कॉन्फ़िगरेशन और दृष्टिकोण के सभी संभावित संयोजनों के लिए 100 माप शामिल हैं। अब मुझे बिल्कुल दो दृष्टिकोण मिल गए हैं और "अनुमोदन"/"अनुमोदन 1" की गति चाहते हैं। इस प्रकार, केवल एक विशिष्ट बेंचमार्क और एक विशिष्ट कॉन्फ़िगरेशन को देखते हुए, मेरे पास मेरे डेटा फ्रेम में "अनुमोदन 1" और "अनुमोदन 2" के 100 माप हैं।

Error in data.frame(list(Time = c(405.73, 342.616, 404.484, 328.742, 403.384, : 
    arguments imply differing number of rows: 100, 0 

आदर्श रूप में, मेरी क्वेरी का परिणाम तीन कॉलम SpeedUp, बेंचमार्क, विन्यास के साथ एक नया डेटा फ्रेम में परिणाम होगा: हालांकि, आर मुझे निम्न त्रुटि दे क्वेरी से उत्पन्न कर देता है। उस पर आधारित मैं फिर, आत्मविश्वास अंतराल और अन्य की गणना करने में सक्षम हो जाएगा।

लेकिन फिलहाल, मूल समस्या यह है कि इस तरह के सामान्यीकरण को कैसे व्यक्त किया जाए। एक और डेटा सेट के लिए मैं इस Time.norm = Time/Time[NumCores == min(NumCores)] जैसे सामान्यीकृत मान की गणना करने में सक्षम था, लेकिन ऐसा लगता है कि यह मौका से काम करता है, कम से कम मुझे अंतर समझ में नहीं आता है।

किसी भी संकेत की सराहना करते हैं। (विशेष रूप से ऐसी समस्याओं के समाधान के लिए सही शब्दावली।)

संपादित करें: चेस के संकेत के लिए धन्यवाद, यहां एक न्यूनतम डेटा सेट है, जो मुझे जो मिला है उसके लिए संरचनात्मक रूप से समान होना चाहिए, और यह उसी व्यवहार को दर्शाता है ऊपर की क्वेरी।

bench <- structure(list(Time = c(399.04, 388.069, 401.072, 361.646), 
      Benchmark = structure(c(1L, 1L, 1L, 1L), .Label = c("Fibonacci"), class = "factor"), 
      Configuration = structure(c(1L, 1L, 1L, 1L), .Label = c("native"), class = "factor"), 
      Approach = structure(c(1L, 1L, 2L, 2L), .Label = c("appr1", "appr2"), class = "factor")), 
     .Names = c("Time", "Benchmark", "Configuration", "Approach"), 
     row.names = c(NA, 4L), class = "data.frame") 
+0

हाय smarr - एक अच्छा तकनीकी प्रश्न तैयार करने के सुझावों के लिए इस प्रश्न पर एक नज़र डालें: http://stackoverflow.com/questions/5963269/how-to-make-a- महान-R-प्रतिलिपि प्रस्तुत करने योग्य-उदाहरण। विशेष रूप से, 'dput (yourData) ' – Chase

+0

जोड़ने पर विचार करें! मैंने ऊपर एक डेटा सेट जोड़ा। – smarr

+0

Arg, शुरुआती गलती! – smarr

उत्तर

0

लगता है मैं अभी भी आर

समाधान इस्तेमाल किया सूत्र में निहित में काफी बुनियादी अवधारणाओं के एक नंबर याद आती है जैसे:, सभी तीन आयामों के अनुसार डेटा ~ Benchmark + Configuration + Approach समूहों और टी टोपी वह नहीं है जो मुझे वास्तव में चाहिए। परिणामी डेटा सेट में वास्तव में केवल "अनुमोदन 1" का डेटा होता था, और वहां से संबंधित होने के लिए बाएं नहीं थे।

तो, फोरमला को ~ Benchmark + Configuration में बदलकर डेटा सेट में परिणाम होता है जिसमें सभी समय माप के लिए "अनुमोदन" और "अनुमोदन" डेटा होता है। और फिर, यह इरादे के रूप में काम करता है :)

0

आप तरीके मैं भोलेपन पहली बार में करने का प्रयास किया में ddply भीतर ऐसा करने के लिए प्रयास करते हैं तो आप पाते हैं कि आप केवल एक व्यक्ति श्रेणियों के भीतर काम कर रहे हैं:

ddply(bench, ~ Benchmark + Configuration + Approach, 
          transform, 
          Ratio = Time/mean(Time[Approach == "appr2"])) 
#------------ 
Time Benchmark Configuration Approach  Ratio 
1 399.040 Fibonacci  native appr1  NaN 
2 388.069 Fibonacci  native appr1  NaN 
3 401.072 Fibonacci  native appr2 1.0516915 
4 361.646 Fibonacci  native appr2 0.9483085 

जाहिर है क्या के लिए आशा व्यक्त की थी नहीं। आप बेंच के बाहर एक मतलब मूल्य की गणना सामान्य कारक हो सकते हैं:

meanappr2 <- mean(subset(bench, Approach == "appr2", Time)) 
    ddply(bench, ~ Benchmark + Configuration + Approach, 
          transform, 
          Ratio = Time/meanappr2) 
#-------------- 
Time Benchmark Configuration Approach  Ratio 
1 399.040 Fibonacci  native appr1 1.0463631 
2 388.069 Fibonacci  native appr1 1.0175950 
3 401.072 Fibonacci  native appr2 1.0516915 
4 361.646 Fibonacci  native appr2 0.9483085 

आप लाइन सामान्य से एक लाइन बल्कि एक क्रॉस समूह तुलना नहीं करना चाहता था तो दूसरी तरफ हैं, का उपयोग करें विकल्प "संक्षेप में प्रस्तुत" भीतर *ply आपरेशनों में:

ddply(bench, ~ Benchmark + Configuration + Approach, 
          summarise, 
          Ratio = mean(Time)/meanappr2) 
#----------- 
    Benchmark Configuration Approach Ratio 
1 Fibonacci  native appr1 1.031979 
2 Fibonacci  native appr2 1.000000 
+0

क्षमा करें, मैं अपने इरादे के बारे में पर्याप्त स्पष्ट नहीं था। मुझे अपनी समस्या का समाधान मिला, और इसे एक उत्तर के रूप में पोस्ट किया। फिर भी, बहुत धन्यवाद! – smarr

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