2016-01-04 18 views
8

में सभी चर कक्षाओं को स्वचालित रूप से सही करने का कोई भी तरीका मेरे पास लगभग 250 चर के साथ डेटाफ्रेम है। दुर्भाग्यवश, इन सभी चर को sqldf का उपयोग करते हुए एक SQL डेटाबेस से वर्ण वर्ग के रूप में आयात किया गया था। समस्या: उन सभी को चरित्र वर्ग नहीं होना चाहिए। संख्यात्मक चर, पूर्णांक, साथ ही तिथियां भी हैं। मैं एक मॉडल बनाना चाहता हूं जो सभी चरों पर चलता है और ऐसा करने के लिए मुझे यह सुनिश्चित करने की ज़रूरत है कि चर के पास सही वर्ग हों। इसे एक-एक करके करना शायद सबसे अच्छा है, लेकिन फिर भी बहुत मैनुअल है।डेटाफ्रेम

मैं सभी कक्षाओं को स्वचालित रूप से कैसे सही कर सकता हूं? शायद यह पता लगाने का एक तरीका है कि कॉलम में वर्णमाला वर्ण हैं या केवल संख्या वर्ण हैं?

मुझे नहीं लगता कि सभी वर्गों को सही करने में एक स्वचालित दृष्टिकोण सही होना संभव है। लेकिन यह अधिकांश वर्गों को सही कर सकता है, फिर जो अच्छे नहीं हैं, मैं उनका ख्याल रख सकता हूं।

मैं डेटा आयात करते समय इसे सही करने के किसी भी तरीके से जानता हूं, तो मुझे एक sqldf टैग जोड़ रहा है, लेकिन मुझे लगता है कि यह sqldf की गलती नहीं बल्कि डेटाबेस की है।

उत्तर

8

निकटतम बात "स्वचालित" एक डेटा फ्रेम पर जैसे रूपांतरण शायद

df[] <- lapply(df, type.convert) 

जहां df अपने डेटा सेट है होगा। फ़ंक्शन type.convert()

एक वर्ण वेक्टर को तार्किक, पूर्णांक, संख्यात्मक, जटिल या कारक के रूप में परिवर्तित करता है।

help(type.convert) का एक पठन है, यह वही हो सकता है जो आप चाहते हैं।

मेरे अनुभव में, type.convert() बहुत विश्वसनीय है। यदि आप पात्रों को कारकों से जोड़ना नहीं चाहते हैं तो आप as.is = TRUE का उपयोग कर सकते हैं। इसके अलावा यह कई महत्वपूर्ण आर कार्यों (जैसे read.table) में आंतरिक रूप से उपयोग किया जाता है, इसलिए यह निश्चित रूप से सुरक्षित है।

यहां iris पर काम करने का एक त्वरित उदाहरण है। सबसे पहले हम सभी कॉलम को चरित्र में बदल देंगे, फिर उस पर type.convert() चलाएं।

## Original column classes in iris 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "numeric" "numeric" "numeric" "numeric"  "factor" 

## Change all columns to character 
iris[] <- lapply(iris, as.character) 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "character" "character" "character" "character" "character" 

## Run type.convert() 
iris[] <- lapply(iris, type.convert) 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "numeric" "numeric" "numeric" "numeric"  "factor" 

हम देख सकते हैं कि कॉलम उनके मूल वर्ग में लौटा दिए गए थे। ऐसा इसलिए है क्योंकि type.convert() "सबसे उपयुक्त" प्रकार के लिए कॉलम कॉलम।

+0

हैलो रिचर्ड, मैंने हाल ही में इसे एक अलग डेटा फ्रेम पर उपयोग किया और इस त्रुटि को 'त्रुटि में त्रुटि (एक्स [[i]], ...): पहला तर्क मोड चरित्र का होना चाहिए' मैं सोच रहा था कि क्या आप जानते थे कि यह क्यों हो रहा था – jgozal

+0

ऐसा लगता है कि type.convert() एक चरित्र वेक्टर की पहली तर्क के रूप में अपेक्षा करता है। मैंने अपने डीएफ को as.character (df) में परिवर्तित करने का प्रयास किया है, लेकिन फिर यह सब कुछ कारक प्रकार – jgozal

+0

@jgozal में परिवर्तित कर दिया गया है यदि आप पात्रों को वर्ण रखने के लिए चाहते हैं और कारकों के लिए मजबूर नहीं होना चाहते हैं, तो 'as.is = TRUE' को' प्रकार में सेट करें .convert' –