2011-08-29 25 views
5

आर का उपयोग करना, मैं एक वेक्टर ऐसेआर में, मैं इंफ और नाइन समेत कारकों के लिए संख्यात्मक मान कैसे मैप करूं?

a <- c(0.1,0.6,23,Inf,NaN) 

के रूप में मैं कुछ करने के लिए इसे पसंद

c("Finite","Finite","Finite","Inf","NaN") 

कन्वर्ट करने के लिए यथासंभव कम दर्द के साथ करना चाहते हैं। यह कैसे किया जाता है?

धन्यवाद! कि एक चरित्र वेक्टर, जो as.factor() साथ परिवर्तित किया जा सकता है या सिर्फ प्रारंभिक कॉल के आसपास factor() लपेट एक कारक के साथ शुरू करने के लिए वापस करने के लिए देता है तकनीकी तौर पर

b <- ifelse(is.finite(a), "Finite", ifelse(is.infinite(a), "Infinite", "NaN")) 
> b 
[1] "Finite" "Finite" "Finite" "Infinite" "NaN" 

,: उरी

उत्तर

0

एक अन्य विधि (इसी तरह Recoding Numeric Vector सवाल करने के लिए) कुछ इस तरह हो सकता है:

type <- rep("Finite", length(a)) 
type[is.nan(a)] <- "NaN" 
type[is.infinite(a)] <- "Infinite" 
+4

SO पर अपने स्वयं के प्रश्नों का उत्तर देना अच्छा अभ्यास है, लेकिन यह एक उत्तर का एक विशेष रूप से खराब उदाहरण है, क्योंकि आपका समाधान नए चर के समूह का परिचय देता है जो प्रश्न में प्रकट नहीं होते हैं। – Andrie

+0

@UriLaserson I थोड़ा सा जवाब साफ़ करें (एंड्री के संकेतों को कवर करें), अगर आपको यह पसंद नहीं है तो रोलबैक के लिए स्वतंत्र महसूस करें। – Marek

6

ifelse() यथोचित अच्छी तरह से काम करने लगता है। .. हालांकि चरित्र आपको अपनी आवश्यकताओं के अनुरूप कर सकता है जो आपको करने की ज़रूरत है।

+0

एक बात: 'एनए 'को आपके समाधान में' NaN "कोड किया गया है। – Marek

2

तुम भी match इस्तेमाल कर सकते हैं (और भूल नहीं है NA के बारे में 'ओं):

f <- function(x) { 
    codes <- c("NaN", "Inf", "Inf", "NA", "Finite") 
    codes[match(x, c(NaN, Inf, -Inf, NA), nomatch=5L)] 
} 

f(a) 
# [1] "Finite" "Finite" "Finite" "Inf" "NaN" 

f(c(7.777, -Inf, NA, Inf, NaN, 0/0)) 
# [1] "Finite" "Inf" "NA"  "Inf" "NaN" "NaN" 
2

यहाँ एक संस्करण जो "फिनिट" को छोड़कर आर के अपने नामों का उपयोग करता है - इसलिए यह लिखने के लिए थोड़ा छोटा है और बोनस भी नकारात्मक अनंतता को नियंत्रित करता है और NA:

अंत में

sub("Inf", "Infinity", format(ifelse(is.finite(a), "Finite", a), justify="none")) 

, आप NA रों रखना चाहते हैं, तो बस:

# Include -Inf and NA... 
a <- c(0.1,0.6,23,Inf,-Inf,NaN,NA) 

format(ifelse(is.finite(a), "Finite", a), justify="none") 
#[1] "Finite" "Finite" "Finite" "Inf" "-Inf" "NaN" "NA" 

... यदि आपको वास्तव में तार "इन्फिनिटी" और "-Infinity" चाहते हैं, तो यह है कि क्या करना होगा format पर कॉल न करें:

sub("Inf", "Infinity", ifelse(is.finite(a), "Finite", a)) 
#[1] "Finite" "Finite" "Finite" "Infinity" "-Infinity" "NaN"  NA 
+0

कुछ संस्करण 'ifelse (is.finite (a), "Finite", as.character (ए)) हो सकता है' जो 'NA' से' NA' ('' NA ''स्ट्रिंग नहीं) को बदलता है। – Marek

+0

@Marek - हाँ मुझे पता है, लेकिन मैंने सोचा कि मेरे पास पहले से ही बहुत सारे संस्करण हैं :) ... और आखिरी एक नक्शा इन्फिनिटी के रूप में इन्फिनिटी के रूप में अनुरोध करता है। – Tommy

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