2011-10-25 7 views
8

मैं आर में डेटा पढ़ने के लिए read.csv या read.csv2 का उपयोग कर सकता हूं लेकिन मुझे जिस समस्या का सामना करना पड़ा वह यह है कि मेरा विभाजक एक वर्ण के बजाय एक बहु-बाइट स्ट्रिंग है। मैं इससे कैसे निपट सकता हूं?एक बहु-बाइट विभाजक के साथ जीएनयू आर में एक टेक्स्ट फ़ाइल कैसे पढ़ा जाए?

+1

अपने एकाधिक-बाइट स्ट्रिंग क्या है? – jthetzel

+0

मेरा मानना ​​है कि यदि आप अधिक सामान्य read.table() और sep तर्क देखते हैं, तो आप एकाधिक-बाइट स्ट्रिंग का उपयोग कर सकते हैं। – mweylandt

+0

@mweylandt मुझे लगता है कि 'read.table() '' sp' केवल एकल बाइट स्वीकार करता है (' स्कैन() 'के लिए)। – jthetzel

उत्तर

9

प्रदान उदाहरण डेटा में मदद मिलेगी। हालांकि, आप अपनी आवश्यकताओं के अनुसार निम्नलिखित अनुकूलित कर सकते हैं। मैं 'test.csv' के रूप में यह बचाया

1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 

:

मैं एक उदाहरण डेटा फ़ाइल है, जो एक सिर्फ एक पाठ निम्न फ़ाइल है जिसमें बनाया। अलगाव चरित्र 'सीईपी' स्ट्रिंग है। मैं read.csv() का उपयोग करता scan() है, जो केवल sep के लिए एक एकल वर्ण को स्वीकार करता है लगता है। इसके चारों ओर पाने के लिए, निम्नलिखित पर विचार:

dat <- readLines('test.csv') 
dat <- gsub("sep", " ", dat) 
dat <- textConnection(dat) 
dat <- read.table(dat) 

readLines() बस में लाइनों पढ़ता gsub एक भी ' ' के लिए बहु-चरित्र जुदाई स्ट्रिंग विकल्प, या जो कुछ भी अपने डेटा के लिए सुविधाजनक है।। फिर textConnection() और read.data() आसानी से सब कुछ वापस पढ़ता है। छोटे डेटासेट के लिए, यह ठीक होना चाहिए। यदि आपके पास बहुत बड़ा डेटा है, तो बहु-वर्ण पृथक्करण स्ट्रिंग को प्रतिस्थापित करने के लिए एडब्ल्यूके जैसे कुछ प्रीप्रोकैसिंग पर विचार करें। उपरोक्त http://tolstoy.newcastle.edu.au/R/e4/help/08/04/9296.html से है।

अद्यतन अपनी टिप्पणी के बारे में, अगर आप अपने डेटा में रिक्त स्थान है, एक अलग प्रतिस्थापन विभाजक का उपयोग करें। निम्नलिखित समारोह के साथ,

1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 

तब:: करने के लिए test.csv को बदलने पर विचार

readMulti <- function(x, sep, replace, as.is = T) 
{ 
    dat <- readLines(x) 
    dat <- gsub(sep, replace, dat) 
    dat <- textConnection(dat) 
    dat <- read.table(dat, sep = replace, as.is = as.is) 

    return(dat) 
} 

प्रयास करें:

readMulti('test.csv', sep = "sep", replace = "\t", as.is = T) 

यहाँ, आप टैब (\t) के साथ मूल विभाजक बदलें। as.isread.table() पर तारों को पढ़ने के लिए कारकों को पढ़ने से रोकने के लिए पास किया गया है, लेकिन यह आपका कॉल है। आप अपने डेटा के भीतर और अधिक जटिल सफेद स्थान है, तो आप AWK, पर्ल, आदि के साथ read.table() सहायक, या पूर्व की प्रक्रिया में quote तर्क मिल सकती है

कुछ crippledlambda के strsplit() के साथ इसी तरह मध्यम आकार डेटा के लिए सबसे अधिक संभावना बराबर है। यदि प्रदर्शन एक मुद्दा बन जाता है, तो दोनों को आजमाएं और देखें कि आपके लिए कौन सा काम करता है।

+0

के नीचे अपना समाधान पसंद है। Read.table एक ही त्रुटि संदेश प्राप्त होगा।jthetzel का सुझाव अच्छा लगता है। असल में मैं पहले से ही आर में पढ़ने से पहले कच्चे डेटा को संसाधित करने के लिए बहुत अधिक लाभ उठाता हूं। लेकिन सवाल यह है कि हम gsub के बाद नए अलगाव चरित्र में चरित्र से कैसे निपट सकते हैं (कहें, हमारे पास एक ' 'अपने नमूना कोड में मूल्य के भीतर)। – RobinMin

+0

@RobinMin उपरोक्त प्रति अद्यतन एक अलग प्रतिस्थापन विभाजक आज़माएं। – jthetzel

3

इस मामले में आप textConnection(txt) को अपने फ़ाइल नाम से बदल सकते हैं, लेकिन अनिवार्य रूप से आप strsplit के आसपास एक कोड या फ़ंक्शन बना सकते हैं। यहाँ मैं आपको एक हैडर रेखा है संभालने हूँ, लेकिन आप निश्चित रूप से एक header तर्क को परिभाषित करने और नीचे कार्य के आधार पर अपने डेटा फ्रेम के निर्माण के सामान्यीकरण दे सकते हैं:

> read.multisep <- function(File,sep) { 
+ Lines <- readLines(File) 
+ Matrix <- do.call(rbind,strsplit(Lines,sep,fixed=TRUE)) 
+ DataFrame <- structure(data.frame(Matrix[-1,]),names=Matrix[1,]) ## assuming header is present 
+ DataFrame[] <- lapply(DataFrame,type.convert)     ## automatically convert modes 
+ DataFrame 
+ } 
> 
> example <- "a#*&b#*&c 
+ 1#*&2#*&3 
+ 4#*&5#*&6" 
> 
> read.multisep(textConnection(example),sep="#*&") 
    a b c 
1 1 2 3 
2 4 5 6 
+0

read.multisep मेरे लिए ठीक काम करता है ~! धन्यवाद @ jthetzel – RobinMin

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