2011-11-28 12 views
20

पर एक स्ट्रिंग मैं दो कॉलम (वैक्टर) में चरित्र तार (लोगों के नाम) का एक वेक्टर विभाजित करना चाहते हैं। समस्या यह है कि कुछ लोगों के पास 'दो शब्द' अंतिम नाम होता है। मैं पहले और अंतिम नामों को दो स्तंभों में विभाजित करना चाहता हूं। मैं नीचे दिए गए कोड का उपयोग करके पहले नाम ले सकता हूं लेकिन अंतिम नाम मुझे बढ़ा सकता है। (नीचे एक नमूना सेट में obs 29 देखें, क्योंकि फोर्ड के पास पैंटेरा एल का "अंतिम नाम" है जिसे एक साथ रखा जाना चाहिए)विभाजन पहला अंतरिक्ष

मैंने अब तक क्या करने का प्रयास किया है;

x<-rownames(mtcars) 
unlist(strsplit(x, " .*")) 

मैं इसे करना चाहते हैं क्या तरह देखने के लिए:

  MANUF  MAKE 
27   Porsche  914-2 
28   Lotus  Europa 
29   Ford  Pantera L 
30   Ferrari  Dino 
31   Maserati Bora 
32   Volvo  142E 

उत्तर

25

नियमित अभिव्यक्ति rexp स्ट्रिंग की शुरुआत में एक वैकल्पिक स्थान, फिर शेष स्ट्रिंग पर शब्द से मेल खाता है। कोष्ठक subexpressions बैकरेरेंस \\1 और \\2 के रूप में उपयोग किया जाता है।

rexp <- "^(\\w+)\\s?(.*)$" 
y <- data.frame(MANUF=sub(rexp,"\\1",x), MAKE=sub(rexp,"\\2",x)) 
tail(y) 
#  MANUF  MAKE 
# 27 Porsche  914-2 
# 28 Lotus Europa 
# 29  Ford Pantera L 
# 30 Ferrari  Dino 
# 31 Maserati  Bora 
# 32 Volvo  142E 
+0

@ जोशुआ उलिच सुंदर। स्पष्टीकरण के लिए भी धन्यवाद। –

0

आप पैटर्न और समूह मिलान कर सकते हैं, तो मैं कुछ इस तरह (untested) की कोशिश करेंगे:

\s+(.*)\s+(.*) 
+4

बस इतना ही पता है, आर में रेगेक्स थोड़ा अलग काम करता है। कम से कम, आपको किसी त्रुटि से बचने के लिए, प्रत्येक के सामने एक और \ जोड़ने की आवश्यकता होगी। – joran

0

मुझे लगता है कि [^\s]+ के लिए खोज काम करेगा। Untested।

17

मेरे लिए, हेडली के reshape2 पैकेज में colsplit समारोह इस उद्देश्य के लिए सबसे सहज है। यहोशू का रास्ता अधिक सामान्य है (यानी जहां भी रेगेक्स का उपयोग किया जा सकता है) और लचीला (यदि आप विनिर्देश बदलना चाहते हैं);

library(reshape2) 
y <- colsplit(x," ",c("MANUF","MAKE")) 
tail(y) 
#  MANUF  MAKE 
#27 Porsche  914-2 
#28 Lotus Europa 
#29  Ford Pantera L 
#30 Ferrari  Dino 
#31 Maserati  Bora 
#32 Volvo  142E 
+0

कॉलम विभाजन का बहुत अच्छा उपयोग। धन्यवाद। –

+0

+1 वास्तव में दिलचस्प है, क्योंकि मैंने माना था कि 'colsplit' इस मामले में तीन से अधिक कॉलम लौटाएगा। मैं कितना गलत था। – Andrie

7

अभी तक यह ऐसा करने का एक और तरीका है: लेकिन colsplit समारोह पूरी तरह से इस विशिष्ट सेटिंग के लिए अनुकूल है

stringr से str_split विभाजन संभाल लेंगे, लेकिन (एक सूची एक अलग रूप में यह देता है, जैसे strsplit करता है)। हालांकि सही रूप में हेरफेर करना सरल है।

library(stringr) 
split_x <- str_split(x, " ", 2) 
(y <- data.frame(
    MANUF = sapply(split_x, head, n = 1), 
    MAKE = sapply(split_x, tail, n = 1) 
)) 

या, हैडली टिप्पणी में उल्लेख किया, str_split_fixed साथ।

1) strsplit:

y <- as.data.frame(str_split_fixed(x, " ", 2)) 
colnames(y) <- c("MANUF", "MAKE") 
y 
+0

@ अभी भी एक हैडली विकम पैकेज के माध्यम से एक और समाधान। –

+2

साझा करने के लिए धन्यवाद 'str_split_fixed' – hadley

+1

का उपयोग करने के लिए और भी बेहतर होगा यह ध्यान रखना दिलचस्प है कि यह उत्तर + हैडली की टिप्पणी' colsplit' समाधान से संबंधित है क्योंकि 'colsplit'' str_split_fixed' का उपयोग करता है। –

11

यहाँ दो दृष्टिकोण हैं। यह दृष्टिकोण केवल आर के मूल में कार्य करता है और कोई जटिल नियमित अभिव्यक्ति नहीं करता है। अर्धविराम से पहले अंतरिक्ष की जगह अर्धविराम पर, strsplit और फिर rbind यह (sub और नहींgsub का प्रयोग करके) एक 2 स्तंभ मैट्रिक्स में: gsubfn पैकेज यहाँ में

mat <- do.call("rbind", strsplit(sub(" ", ";", x), ";")) 
colnames(mat) <- c("MANUF", "MAKE") 

2) strapply एक से एक है gsubfn पैकेज में strapply का उपयोग कर -लाइनर। वांछित पहले और दूसरे कॉलम क्रमशः रेगुलर एक्सप्रेशन कैप्चर के दो parenthesized भागों और समारोह (जो सूत्र अंकन में निर्दिष्ट किया जाता है - function(x, y) c(MANUF = x, MAKE = y) निर्दिष्ट करने के रूप में अपनी ही) उन्हें पकड़ लेता है और नाम कहते हैं।simplify=rbind तर्क का उपयोग इसे पहले समाधान में मैट्रिक्स में बदलने के लिए किया जाता है।

library(gsubfn) 
mat <- strapply(x, "(\\S+)\\s+(.*)", ~ c(MANUF = x, MAKE = y), simplify = rbind) 

नोट: या तो मामले एक "character" मैट्रिक्स, mat, दिया जाता है में। "character" कॉलम की एक डेटा फ्रेम वांछित है, तो इस जोड़ें:

DF <- as.data.frame(mat, stringsAsFactors = FALSE) 

छोड़ stringsAsFactors तर्क "factor" कॉलम चाहता था कर रहे हैं।

+0

मैंने अभी यहां वापस जांच की है। मैं वास्तव में आपके # 1 समाधान को किसी भी आपूर्ति के सर्वोत्तम पसंद को घायल कर देता हूं। बाद में वापसी के लिए धन्यवाद और खेद है। –

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