2011-10-18 15 views
9

(प्रस्तावना: मैं न तो एक सांख्यिकीविद् और न ही प्रोग्रामर हूं। मैं मानविकी में काम करता हूं, इसलिए मेरी आत्मा पर दया करें)।आर में यूक्लिडियन दूरी की गणना

> x <- c(0,0) 
> y <- c(0,10) 
> dist(rbind(x,y)) 
    x 
y 10 

अब तक तो अच्छा,:

आई) आर में अंक मैं जिले (प्रयोग कर रहे की एक श्रृंखला के बीच इयूक्लिडियन दूरी की गणना करने के, इस प्रकार की जरूरत है। लेकिन जब मैं अपने परिणामों को देख रहा था (वास्तविक संख्याओं के साथ), वे बहुत दूर थे। इतना है कि मैंने पाया कि मेरी आर स्क्रिप्ट गलत कॉलम से डेटा पकड़ रही थी। लेकिन मैंने जांच की, और यह नहीं है।

तो मैंने खिलौनों की संख्या के साथ खेलना शुरू कर दिया, और मैं आश्चर्यचकित था। ऊपर के उदाहरण (एक खड़ी रेखा) सही ढंग से काम करता है, के रूप में निम्नलिखित (एक क्षैतिज रेखा) करता है:

> x <- c(0,10) 
> y <- c(0,0) 
> dist(rbind(x,y)) 
    x 
y 10 

लेकिन जब लाइन दो अंक प्रपत्र विकर्ण है, विचित्रता ensues:

> x <- c(0,10) 
> y <- c(0,10) 
> dist(rbind(x,y)) 
    x 
y 0 

एक 0 की दूरी? है ना? यह सही नहीं हो सकता है।

और जब अंक समान (है कि मेरे डेटा में संभव है), हम खरगोश की मांद नीचे जाना कर रहे हैं:

> x <- c(0,0) 
> y <- c(10,10) 
> dist(rbind(x,y)) 
    x 
y 14.14214 

इस 0 नहीं होना चाहिए? अंक समान हैं, आखिरकार, उनके बीच कोई दूरी नहीं हो सकती है।

बस अगर() के साथ कुछ गड़बड़ है, तो मैंने विकिपीडिया द्वारा मैन्युअल रूप से फ़ॉर्मूला को कार्यान्वित करने का प्रयास किया। एक ही परिणाम:

> sqrt(sum((x - y)^2)) 
[1] 14.14214 

जैसा कि मैंने ऊपर कहा, मेरी गणित पृष्ठभूमि कम है, तो मैं पूरी तरह से उम्मीद करते हैं कि यहाँ त्रुटि मेरा है। यदि ऐसा है, तो कृपया बताएं कि यह क्या है और इसे कैसे ठीक किया जाए। लेकिन जहां से मैं अभी खड़ा हूं, ऐसा लगता है कि कुछ गलत है।

और सबसे खराब, मैं अपने डेटा का विश्लेषण नहीं कर सकता।

+3

+1 एक स्पष्ट पहली पोस्ट के लिए जो दस्तावेज़ीकरण दिशानिर्देशों का पालन करता है। –

उत्तर

14

ऐसा लगता है कि आप dist(cbind(x, y)), dist(rbind(x, y)) नहीं चाहते हैं।

+0

वास्तव में यह चाल चल रहा है - क्योंकि मेरे एक्स वेक्टर में सभी एक्स निर्देशांक हैं, और मेरे वाई वेक्टर में सभी वाई हैं, मुझे पंक्ति से नहीं, कॉलम से बांधना होगा। धन्यवाद! –

9

distके बीच एक दूरी मैट्रिक्स की गणना करता है जो पंक्तियों की प्रत्येक जोड़ी है। यदि आपकी पंक्तियां समान हैं, जैसे कि आपके पहले 'अजीब' उदाहरण में, तो दूरी वास्तव में 0 होगी। यदि आपकी पंक्तियां स्थिर हैं 0 और निरंतर 10, जैसा कि आपके दूसरे उदाहरण में है, तो दूरी वास्तव में sqrt ((10- 0)^2 + (10-0)^2) = 14.142 ...

+0

ए-हा! सब साफ़। मदद की सराहना करें। –

7

आपको लगता है तुम क्या कर रहे हो जब आप चलाने के इस:

x <- c(0,10) 
y <- c(0,0) 
dist(rbind(x,y)) 

है कि आप दो अंक, (0,0) और (10,0) परिभाषित किया है, और उन दो अंक के बीच की दूरी की गणना करने के आर पूछा।

लेकिन वास्तव में, आपने आर को ऐसा करने के लिए नहीं कहा है!

जब आप वैक्टर x और y एक साथ rbind, आप मैट्रिक्स के साथ अंत:

rbind(c(0,10),c(0,0)) 
    [,1] [,2] 
[1,] 0 10 
[2,] 0 0 

जब आप dist कहते हैं, यह पंक्तियां इस मैट्रिक्स के के बीच की दूरी की गणना। इसलिए, उनके बीच की दूरी 10.

उम्मीद है कि अब समझ में आता है!

+0

बहुत बहुत धन्यवाद! यह वास्तव में अब समझ में आता है। –

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