2013-08-18 8 views
12

मैं उदाहरण के लिए सीमा [1,10]आर में एक अलग श्रृंखला के लिए एक वेक्टर मैप करने के लिए कैसे?

c(1,2,9,10) 

में एक सदिश है और मैं एक अलग श्रेणी के लिए यह मैप करना चाहते हैं, [12,102]

c(12,22,92,102) 

वहाँ एक समारोह पहले से ही अनुसंधान में यह करता है कि है?

+0

आप अपने मानचित्रण व्याख्या कर सकते हैं? मुझे समझ में नहीं आता कि क्यों 2 को 62 तक मैप किया गया है या क्यों 270 आपकी सीमा के बाहर गिरने के बाद से है। – David

+0

क्षमा करें @ डेविड, मैंने दो उदाहरणों को मिश्रित किया जो मैं समस्या को समझने के लिए उपयोग कर रहा था। यह मूल रूप से एक रैखिक मैपिंग है। – nachocab

+0

यह स्पष्ट होना चाहिए, लेकिन यह एक 'आर' सवाल नहीं है। यह मूल रैखिक बीजगणित से संबंधित एक प्रश्न है। –

उत्तर

15
linMap <- function(x, from, to) 
    (x - min(x))/max(x - min(x)) * (to - from) + from 

linMap(vec, 12, 102) 
# [1] 12 22 92 102 

या अधिक स्पष्ट रूप से:

linMap <- function(x, from, to) { 
    # Shifting the vector so that min(x) == 0 
    x <- x - min(x) 
    # Scaling to the range of [0, 1] 
    x <- x/max(x) 
    # Scaling to the needed amplitude 
    x <- x * (to - from) 
    # Shifting to the needed level 
    x + from 
} 

rescale(vec, c(12, 102)) पैकेज scales का उपयोग कर काम करता है। इसके अलावा एक एक चतुर रास्ते में approxfun का फायदा उठाने सकता है के रूप में @flodel ने सुझाव दिया:

linMap <- function(x, a, b) approxfun(range(x), c(a, b))(x) 
+0

मेरे पास आपके 'linMap' और' rescale' में एक अस्थायी व्यवहार है जहां कुछ कॉलम R 3.3.2 में शून्य पर जाते हैं। उदाहरण मूल्य 'all.dat <- c (2274 9 5 9, 1531001)'। तुम जानते हो क्यों? –

+0

@ मासी, अस्थायी व्यवहार से आपका क्या मतलब है? मुझे लगता है कि मेरे उत्तर के नोटेशन में 'all.dat'' x' है। फिर 'से'', 'to', आपके अपेक्षित आउटपुट और इसके बजाय आप क्या प्राप्त कर रहे हैं? – Julius

+0

मुझे इसके बजाय शून्य कॉलम मिलता है। –

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