2013-05-13 7 views
31

मेरे पास एक .csv-file से लिया गया डेटा फ्रेम है जिसमें संख्यात्मक और वर्ण मान शामिल हैं। मैं इस डेटा फ्रेम को एक मैट्रिक्स में परिवर्तित करना चाहता हूं। सभी युक्त जानकारी संख्याएं हैं (गैर-संख्या-पंक्तियां जिन्हें मैंने हटाया है), इसलिए डेटा फ्रेम को एक संख्यात्मक मैट्रिक्स में परिवर्तित करना संभव होना चाहिए। हालांकि, मुझे एक चरित्र मैट्रिक्स मिलता है।डेटा.फ्रेम को एक न्यूमेरिक मैट्रिक्स में कनवर्ट करने का सही तरीका, जब डीएफ में स्ट्रिंग भी होती है?

मुझे यह हल करने का एकमात्र तरीका यह है कि प्रत्येक पंक्ति के लिए as.numeric का उपयोग करें, लेकिन यह काफी समय लेने वाला है। मुझे पूरा यकीन है कि if(i in 1:n) -form के साथ ऐसा करने का कोई तरीका है, लेकिन मैं यह नहीं समझ सकता कि यह कैसे काम कर सकता है। या यहां वास्तव में संख्यात्मक मूल्यों से शुरू होने का एकमात्र तरीका है, जैसे यहां प्रस्तावित (Making matrix numeric and name orders)? पी

मैट्रिक्स एक बहुत बड़ा है, यह केवल पहली कुछ पंक्तियों है ... कोड यह रहा::

शायद यह आप में से अधिकांश के लिए एक बहुत आसान बात है

cbind(
as.numeric(SFI.Matrix[ ,1]), 
as.numeric(SFI.Matrix[ ,2]), 
as.numeric(SFI.Matrix[ ,3]), 
as.numeric(SFI.Matrix[ ,4]), 
as.numeric(SFI.Matrix[ ,5]), 
as.numeric(SFI.Matrix[ ,6])) 

# to get something like this again: 

Social.Assistance Danger.Poverty GINI S80S20 Low.Edu  Unemployment 
0.147    0.125   0.34 5.5 0.149  0.135 0.18683691 
0.258    0.229   0.27 3.8 0.211  0.175 0.22329362 
0.207    0.119   0.22 3.1 0.139  0.163 0.07170422 
0.219    0.166   0.25 3.6 0.114  0.163 0.03638525 
0.278    0.218   0.29 4.1 0.270  0.198 0.27407825 
0.288    0.204   0.26 3.6 0.303  0.211 0.22372633 

धन्यवाद आप किसी भी मदद के लिए!

+0

numerics में कनवर्ट कर रहा numerics संग्रहीत के रूप में तार वापस उन्हें जोड़ने तुच्छ है अन्य स्ट्रिंग्स को न्यूमेरिक्स में कनवर्ट करना असंभव है (जब तक कि वे कारक न हों, इस स्थिति में यह एक भयानक अभ्यास है, सांख्यिकीय रूप से)। कारकों के रूप में, आपने उनका उल्लेख नहीं किया है, लेकिन कारकों को संख्यात्मक रूप से परिवर्तित करना इस प्रश्न का एकमात्र दिलचस्प हिस्सा है। – smci

उत्तर

40

संपादित करें 2: फ़्लोडेल का उत्तर देखें। काफी बेहतर।

प्रयास करें:

# assuming SFI is your data.frame 
as.matrix(sapply(SFI, as.numeric)) 

संपादित करें: या के रूप में @ CarlWitthoft टिप्पणी में सुझाव दिया:

matrix(as.numeric(unlist(SFI)),nrow=nrow(SFI)) 
+0

हां, एसएफआई डेटा.फ्रेम था, और हाँ, यह समस्या हल हो गई! धन्यवाद! – PikkuKatja

+3

क्यों नहीं 'मैट्रिक्स (as.numeric (असूची (एसएफआई)), एनआर = nrows (एसएफआई)) '? –

+0

@CarlWitthoft, इस बात के संदेह के कारण कि 'अनलिस्ट' का जबरन अंतिम परिणाम को कैसे प्रभावित करेगा, लेकिन आप इंटरमीडिएट जबरदस्ती के बावजूद उसमें सही हो सकते हैं, 'as.numeric' से अंतिम जबरदस्ती एक ही परिणाम उत्पन्न करनी चाहिए। उत्तर –

38
data.matrix(SFI) 

?data.matrix से:

Description: 

Return the matrix obtained by converting all the variables in a 
data frame to numeric mode and then binding them together as the 
columns of a matrix. Factors and ordered factors are replaced by 
their internal codes. 
+1

अद्यतन किया गया यह एक कारक के रूप में "123" की व्याख्या करेगा और इसे संबंधित पूर्णांक स्तर में परिवर्तित करेगा। – antonio

+0

@antonio। आप जो कहते हैं वह सच नहीं है। यदि डेटा.फ्रेम में वर्ण होते हैं, तो उन्हें संख्याओं में परिवर्तित कर दिया जाता है, कोशिश करें: 'data.matrix (data.frame (x =" 123 ", स्ट्रिंग्सएफ़ैक्टर्स = गलत))'। यह केवल तभी होता है जब डेटा.फ्रेम में कारक होते हैं जिन्हें वे अपने आंतरिक मूल्य (जैसा ऊपर उद्धृत किया गया है) द्वारा दर्शाया जाता है, 'data.matrix (data.frame (x = "123", स्ट्रिंग्सएफ़एक्टर्स = TRUE) आज़माएं। तो सब कुछ व्यवहार कर रहा है जैसा कि मैं उम्मीद करता हूं और दस्तावेज के रूप में। – flodel

+0

क्षमा करें, मेरा मतलब है कि आपको स्ट्रिंग से सीधे एक संख्या नहीं मिलती है, जब तक कि आप 'read.csv' के लिए 'स्ट्रिंग्सएफ़ैक्टर्स' या 'as.is' का उपयोग न करें। – antonio

0

मैं मैन्युअल fil सीएसवी को निर्यात करके एनएएस का नेतृत्व किया और फिर इसे संपादित करना और पुनः आयात करना। कदम 1 के बाद

शायद आप में से एक विशेषज्ञों को स्पष्ट करने वाले क्यों इस प्रक्रिया इतनी अच्छी तरह से काम किया है, जो सभी char प्रकार बन गया है (पहले फ़ाइल प्रकारों char, INT और num (चल बिन्दु संख्या) के डेटा के साथ कॉलम था); लेकिन चरण 3 आर के अंत में प्रत्येक कॉलम के डेटाटाइप को सही ढंग से पहचाना गया)।

# STEP 1: 
MainOptionFile <- read.csv("XLUopt_XLUstk_v3.csv", 
          header=T, stringsAsFactors=FALSE) 
#... STEP 2: 
TestFrame <- subset(MainOptionFile, str_locate(option_symbol,"120616P00034000") > 0) 
write.csv(TestFrame, file = "TestFrame2.csv") 
# ... 
# STEP 3: 
# I made various amendments to `TestFrame2.csv`, including replacing all missing data cells with appropriate numbers. I then read that amended data frame back into R as follows:  
XLU_34P_16Jun12 <- read.csv("TestFrame2_v2.csv", 
          header=T,stringsAsFactors=FALSE) 

आर में आगमन पर, सभी स्तंभों में आर द्वारा स्वचालित रूप से मान्यता प्राप्त उनके सही माप स्तर थे!

+0

आपने गायब डेटा को संख्याओं के साथ बदल दिया है? वह विश्लेषण कैसे चला गया? –

+0

लापता डेटा सेल, रिचर्ड के दो ब्लॉक में स्टॉक मूल्य उद्धरण थे। तो मैंने मैन्युअल रूप से उन्हें आपूर्ति की। मैं अनुमान लगा रहा हूं कि चरण 2 पर आर द्वारा फ़ाइल का आउटपुट करना महत्वपूर्ण था, जिसने चरण 3 पर फ़ाइल को वापस लौटाए जाने पर प्रत्येक कॉलम की आर की सही व्याख्या की सुविधा प्रदान की होगी। वैसे भी, यह एक * बड़ी * फ़ाइल थी, तो मैं व्यक्तिगत कॉलम के लिए डेटा संरचनाओं का वर्णन करने से बचने के लिए वास्तव में खुश था। – user3315638

+0

@ user3315638: निर्यात और पुन: आयात करना पूरी तरह से अनावश्यक था, आप जो भी कर रहे हैं वह 'sapply (df [, StringColsToChangeToNumeric], as.numeric)' – smci

5

डेटा फ्रेम में केवल संख्याएं हैं, तो यह एक वैकल्पिक तरीका है।

apply(as.matrix.noquote(SFI),2,as.numeric)

लेकिन एक मैट्रिक्स के एक डेटा फ्रेम में परिवर्तित करने का सबसे विश्वसनीय तरीका data.matrix() समारोह का उपयोग कर रहा है।

+0

data.matrix काम नहीं किया लेकिन आपका समाधान काम किया :-) – discipulus

+0

यह वास्तविक जवाब है। अन्य समाधानों ने सभी के लिए डेटा को कुछ तरीके से गिरफ्तार किया। – pbible

-1

इसे करने का एक और तरीका है read.table() तर्क colClasses का उपयोग करके colclasses = c (कॉलम क्लास प्रकार) बनाकर कॉलम प्रकार निर्दिष्ट करने के लिए है। यदि 6 कॉलम हैं जिनके सदस्य आप संख्यात्मक के रूप में चाहते हैं, तो आपको डेटा स्ट्रिंग को "संख्यात्मक" को दो बार अल्पविराम से अलग करने, डेटा फ्रेम आयात करने और डेटा फ्रेम के रूप में दोहराना होगा। अनुलेख ऐसा लगता है कि आपके पास हेडर हैं, इसलिए मैंने हेडर = टी रखा है।

as.matrix(read.table(SFI.matrix,header=T, 
colClasses=c("numeric","numeric","numeric","numeric","numeric","numeric"), 
sep=",")) 
0

मैं एक ही समस्या थी और मैं इसे इस तरह हल, द्वारा पंक्ति के नाम के बिना मूल डेटा फ्रेम लेने और बाद में

SFIo <- as.matrix(apply(SFI[,-1],2,as.numeric)) 
row.names(SFIo) <- SFI[,1] 
संबंधित मुद्दे

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