2011-01-01 9 views
13

मैंने ज्यादातर पायथन में प्रोग्राम किया है, लेकिन अब मैं सांख्यिकीय प्रोग्रामिंग भाषा आर सीख रहा हूं। मैंने उन भाषाओं के बीच कुछ अंतर देखा है जो मुझे यात्रा करते हैं।पायथन प्रोग्रामर के लिए आर में समस्याएं

मान लीजिए v 1 से 5 के पूर्णांक वाले एक वेक्टर/सरणी है।

v[3] # in R: gives me the 3rd element of the vector: 3 
     # in Python: is zero-based, gives me the integer 4 
v[-1] # in R: removes the element with that index 
     # in Python: gives me the last element in the array 

क्या कोई अन्य समस्या है जिसके लिए मुझे देखना है?

+2

'v [3] 'पायथन में आपको अनुक्रम का चौथा तत्व देता है। दिए गए मामले में '4' होगा। – SilentGhost

+0

@SilentGost: बेशक, गलती तय की। – BioGeek

+2

शीर्षक इस सवाल का सटीक रूप से प्रतिनिधित्व नहीं करता है - ये "आर में नुकसान" नहीं हैं, वे केवल दो अलग-अलग भाषाओं के बीच बुनियादी अंतर हैं। और वैसे भी, v [-1] इंडेक्स 1 के साथ "तत्व को हटा नहीं" करता है, यह प्रत्येक तत्व के साथ एक नया वेक्टर देता है लेकिन पहला वाला। – mdsumner

उत्तर

16

के लिए आ रहा प्रोग्रामर के लिए एक महान संसाधन है, अनुसंधान बस है पाइथन से बहुत अधिक idiosyncratic और कम संगत। छोटे से मध्यम आकार के डेटासेट पर त्वरित भूखंड और जांच करने के लिए यह वास्तव में अच्छा है, मुख्य रूप से क्योंकि इसकी अंतर्निहित डेटाफ्रेम ऑब्जेक्ट numpy/scipy समकक्ष की तुलना में अच्छी है, लेकिन आपको सभी प्रकार की अजीबता मिल जाएगी क्योंकि आप चीजों को और अधिक जटिल करते हैं एक लाइनर मेरी सलाह है rpy2 (दुर्भाग्यवश दुर्भाग्य से अपने पूर्ववर्ती, आरपीआई की तुलना में बहुत खराब यूआई है) और पाइथन में शेष के साथ आर में जितना संभव हो उतना कम करें।

> u = matrix(1:9,nrow=3,ncol=3) 
> v = u[,1:2] 
> v[1,1] 
[2] 1 
> w = u[,1] 
> w[1,1] 
Error in w[1, 1] : incorrect number of dimensions 

कि कैसे असफल क्यों हुआ:

उदाहरण के लिए, निम्नलिखित मैट्रिक्स कोड पर विचार? इसका कारण यह है कि यदि आप किसी मैट्रिक्स से एक सबमैट्रिक्स चुनते हैं जिसमें किसी दिए गए अक्ष के साथ केवल एक कॉलम होता है, तो आर "मददगार" उस कॉलम को छोड़ देता है और चर के प्रकार को बदलता है। तो डब्ल्यू बल्कि एक मैट्रिक्स से पूर्णांकों का एक वेक्टर है:

> class(v) 
[1] "matrix" 
> class(u) 
[1] "matrix" 
> class(w) 
[1] "integer" 

इससे बचने के लिए, आप वास्तव में एक अस्पष्ट कीवर्ड पैरामीटर पारित करने के लिए की जरूरत है:

> w2 = u[,1,drop=FALSE] 
> w2[1,1] 
[3] 1 
> class(w2) 
[1] "matrix" 

वहाँ nooks और इस तरह crannies का एक बहुत कुछ है। शुरुआत में आपका सबसे अच्छा दोस्त आत्मनिरीक्षण और ऑनलाइन सहायता उपकरण जैसे str, class, example, और निश्चित रूप से help होगा। साथ ही, R Graph Gallery और रिपली की Modern Applied Statistics with S-Plus पुस्तक पर उदाहरण कोड को देखना सुनिश्चित करें।


संपादित: यहाँ कारकों के साथ एक और महान उदाहरण है।

> xx = factor(c(3,2,3,4)) 
> xx 
[1] 3 2 3 4 
Levels: 2 3 4 
> yy = as.numeric(xx) 
> yy 
[1] 2 1 2 3 

पवित्र गाय! एक कारक से वापस एक संख्यात्मक रूप से परिवर्तित करने से वास्तव में रूपांतरण नहीं किया गया था जिसे आपने सोचा था। इसके बजाय यह कारक के आंतरिक गणित प्रकार पर कर रहा है। यह उन लोगों के लिए कठिन खोजने वाली बग का स्रोत है जो इस बारे में अवगत नहीं हैं, क्योंकि यह अभी भी पूर्णांक लौट रहा है और वास्तव में वास्तव में कुछ कार्य करता है (जब इनपुट पहले ही संख्यात्मक रूप से आदेश दिया जाता है)।

यह आप वास्तव में क्या करने के लिए

> as.numeric(levels(xx))[xx] 
[1] 3 2 3 4 

हाँ, यकीन है कि, यह तथ्य factor मदद पृष्ठ पर है की जरूरत है, लेकिन आप केवल वहाँ भूमि जब आप इस बग के कुछ ही घंटों के खो दिया है क्या है। यह एक और उदाहरण है कि आर आपके द्वारा किए जाने वाले कार्यों को कैसे नहीं करता है। टाइप रूपांतरणों या सरणी और सूचियों के तत्वों तक पहुंचने वाली चीज़ों के साथ बहुत सावधान रहें।

+3

+1 के लिए एक महान संदर्भ। भगवान मुझे उस 'ड्रॉप = TRUE' डिफ़ॉल्ट से नफरत है। – fabians

+0

मुझे खेद है, लेकिन यह विशेष रूप से एक व्यक्तिगत राय है। आप वास्तव में कुछ डिफ़ॉल्ट से खुश नहीं हो सकते हैं, या इसे "कम मूर्खतापूर्ण" पाते हैं, लेकिन इसके लिए इसे डिजाइन किया गया है, जो कि _my_ व्यक्तिगत राय में पाइथन को बेहतर बनाता है। मैं अभी आर आर कैसे काम करता है, और जैसा कि आप अक्सर मैट्रिक्स से एक पंक्ति या कॉलम का चयन करते हैं, ताकि ** वेक्टरिज्ड ** गणना कर सकें, डिफ़ॉल्ट ड्रॉप = टी सभी अनलॉक नहीं है। –

+0

अच्छा, यकीन है, लेकिन आप एक एन एक्स 1 मैट्रिक्स को गुणा कर सकते हैं साथ ही साथ आप एक लंबाई एन वेक्टर भी कर सकते हैं। एक प्रकार के रूपांतरण को मजबूर करने का कोई कारण नहीं है। वैसे भी, सिर्फ कहते हैं कि यह (numpy सहित) किसी अन्य मैट्रिक्स भाषा पुस्तकालय में व्यवहार नहीं है और इसलिए लेखक का मूल प्रश्न पुनः के लिए प्रासंगिक है करते हैं: नुकसान :) – ramanujan

1

हो सकता है ... लेकिन इससे पहले कि आप उस पर शुरूआत करें, आपने कुछ उपलब्ध पायथन एक्सटेंशन की कोशिश की है? Scipy में एक सूची है।

14

यह विशेष रूप से बनाम आर पृष्ठभूमि अजगर को संबोधित नहीं है, लेकिन R inferno दोनों भाषाओं में कोड की लाइनों के हजारों लिखा करने के बाद आर

+3

+1 - आर "pitfalls" –

7

इस पोस्ट का स्वीकार्य उत्तर संभवतः पुराना है। Pandas पायथन लाइब्रेरी अब अद्भुत आर-जैसे डेटाफ्रेम समर्थन प्रदान करता है।

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