2012-08-24 17 views
5

का कुशल उपयोग डेटाबेस में आर में आयात किए गए कई सौ वर्ण वैक्टर हैं - प्रत्येक की लंबाई 6-7 मिलियन है। वे या तो संख्यात्मक या कारक डेटा हैं जिनमें लेबल के लिए वर्ण (अक्षर) होते हैं - स्तरों को सेट करने के साथ, सभी कारक, सभी में कुछ एनएएस होते हैं। एक उदाहरणas.numeric() और कारक()

vecA <- c("1",NA, "2",....,NA, "100") 
vecB <- c("smith", NA, NA, ... , "jones") 

के रूप में वहाँ संख्यात्मक और vecB को vecA मजबूर करने के लिए कारक एक कारगर तरीका है। समस्या यह है कि मुझे नहीं पता कि संख्यात्मक और कारक वैक्टर डेटा में कहां हैं और उनमें से एक-एक करके जाने के लिए कठिन है।

+0

ये वेक्टर एक ही वस्तु में हैं, या वे अलग-अलग वस्तुएं हैं? क्या उनके नियमित उदाहरण हैं, जैसा कि आपके उदाहरण में है? –

+0

मैं एक समारोह में डेटाबेस से एक समय में प्रत्येक वेक्टर को कॉल करने जा रहा हूं। वह कार्य समानांतर हो सकता है। कुछ तारों में विशेष पात्र होंगे - लेकिन केवल कारक प्रकार के डेटा के लिए। – Yoda

उत्तर

7

मैं शायद tryCatch() का उपयोग करेंगे, पहले प्रयास कर वर्ग "numeric" करने के लिए प्रत्येक वेक्टर कन्वर्ट करने के लिए। यदि as.numeric() एक चेतावनी संदेश फेंकता है (जैसा कि इनपुट वेक्टर में गैर-संख्यात्मक वर्ण होते हैं), तो मैं चेतावनी पकड़ूंगा और इसके बजाय वेक्टर को कक्षा "factor" में परिवर्तित कर दूंगा।

vecA <- c("1",NA, "2",NA, "100") 
vecB <- c("smith", NA, NA, "jones") 

myConverter <- function(X) tryCatch(as.numeric(X), 
            warning = function(w) as.factor(X)) 

myConverter(vecA) 
# [1] 1 NA 2 NA 100 
myConverter(vecB) 
# [1] smith <NA> <NA> jones 
# Levels: jones smith 
+0

जीनियस! बहुत बहुत धन्यवाद। – Yoda

1

शायद एक नियमित अभिव्यक्ति? प्रत्येक वेक्टर के लिए, संख्याओं की तरह दिखने वाली चीज़ों से मेल खाते हैं।

convert.numeric <- function(vec) { 
    if(grepl("^[0-9]*(\\.[0-9]+)?$",vec)) == !is.na(vec))) { 
    vec <- as.numeric(vec) 
    } else { vec <- as.factor(vec) } 
    return(vec) 
} 

फिर एक सूची में अपने वैक्टर लपेट और lapply का उपयोग करें:

new.vectors <- lapply(old.vectors,convert.numeric) 
+1

केवल पहले 500 तत्वों का परीक्षण करने के लिए और अधिक कुशल हो सकता है। –