2011-06-04 13 views
11

मेरे पास आर में डेटा है जो इस तरह दिख सकता है:पहली जगह के बाद सभी पात्रों को मिटाने के लिए आर में नियमित अभिव्यक्तियां?

USDZAR Curncy 
R157 Govt 
SPX Index 

दूसरे शब्दों में, एक शब्द, इस मामले में ब्लूमबर्ग सुरक्षा पहचानकर्ता, उसके बाद एक और शब्द, जो सुरक्षा वर्ग है, एक स्थान से अलग होता है। मैं कक्षा और स्थान को पाने के लिए बाहर निकलना चाहता हूं:

USDZAR 
R157 
SPX 

आर में ऐसा करने का सबसे प्रभावी तरीका क्या है? क्या यह नियमित अभिव्यक्ति है या मुझे कुछ ऐसा करना चाहिए जैसा कि मैं एमएस एक्सेल में मध्य का उपयोग करके और कमांड ढूंढूंगा? उदाहरण के लिए एक्सेल में मैं कहूंगा:

=MID(@REF, 1, FIND(" ", @REF, 1)-1) 

जिसका अर्थ है वर्ण 1 से शुरू होने वाला एक सबस्ट्रिंग लौटाएं, और पहली जगह की वर्ण संख्या (वास्तविक स्थान को मिटाने के लिए कम 1) पर समाप्त हो।

क्या मुझे आर में कुछ ऐसा करने की ज़रूरत है (इस मामले में, समतुल्य क्या है), या नियमित अभिव्यक्ति यहां सहायता कर सकती है? धन्यवाद।

उत्तर

23

1) कोशिश इस जहां नियमित अभिव्यक्ति एक अंतरिक्ष वर्णों के किसी अनुक्रम और sub के बाद से मेल खाता है बदल देता है कि एक स्ट्रिंग शून्य पात्रों को:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
sub(" .*", "", x) 
## [1] "USDZAR" "R157" "SPX" 

2) एक वैकल्पिक अगर तुम चाहते थे डेटा फ्रेम में अलग-अलग स्तंभों में दो शब्द निम्नानुसार हैं। यहां as.is = TRUE कॉलम कारक के बजाय चरित्र बनता है।

read.table(text = x, as.is = TRUE) 
##  V1  V2 
## 1 USDZAR Curncy 
## 2 R157 Govt 
## 3 SPX Index 
+0

शानदार धन्यवाद। –

1

regex के लिए खोज करने के लिए होगा:

\x20.* 

और कोई रिक्त स्ट्रिंग के साथ बदलें।

यदि आप जानना चाहते हैं कि यह तेज़ है, तो बस समय है।

+0

धन्यवाद, सही तो मैं टाइप कर रहा हूँ: ("। \ X20 *" "R157 सरकार")> ग्रेप और मैं वापस हो रही है: [1] 1, यानी मूल्य 1. मैं वहां से कहां जाऊं? –

+0

इस प्रकार का रेगेक्स आर –

+0

के साथ अच्छी तरह से काम नहीं करता है, उस उपयोग के साथ समस्या यह थी कि आप यह समझने में नाकाम रहे कि बैकस्लैश रेगेक्स में विशेष है और इसलिए खुद को "बच निकला" होना चाहिए। पैटर्न पैटर्न में जब इसे इससे पहले दो बाक्सलैश की आवश्यकता होती है। आज़माएं: 'सब (" \\\ x20। * "," "," आर 157 सरकार ")' –

2

तुम मुझे पसंद कर रहे हैं, में है कि regexp का हमेशा एक गूढ़, निराशा रहस्य बना रहेगा, तो यह clunkier समाधान भी मौजूद है:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
unlist(lapply(strsplit(x," ",fixed=TRUE),"[",1)) 

तय = सच है नहीं अत्यंत आवश्यक होता है, बस यह इंगित करते हुए कि आप यह (सरल मामला) w/बाहर वास्तव में regexp के बारे में पहली चीज़ को जान सकते हैं।

@ वोज्शिच की टिप्पणी को दर्शाने के लिए संपादित किया गया।

+0

हाहा हां - धन्यवाद जोरन। क्लंक शैली का उपयोग एक्सेल में किया जाता है, इसलिए मैं सोच रहा था कि मुझे (अंत में) regex सीखना चाहिए। –

+0

अज्ञात फ़ंक्शन यहां आवश्यक नहीं है, इसलिए आप असूचीबद्ध करने के लिए सरल बना सकते हैं (lapply (strsplit (x, "", fixed = TRUE), "[", 1))। –

+0

धन्यवाद @Wojciech, मैं तदनुसार संपादित करूँगा ... – joran

4

यह stringr साथ बहुत आसान है:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 

library(stringr) 
str_split_fixed(x, " ", n = 2)[, 1] 
संबंधित मुद्दे