2013-03-21 9 views
5

याएआरक्यू (फिर भी एक और रेगेक्स प्रश्न)।वाक्य में अंतिम शब्द द्वारा कॉलम

मैं निम्नलिखित कॉलम को दो कॉलम में विभाजित करने के बारे में कैसे जाउंगा, यह सुनिश्चित कर लें कि अंतिम कॉलम में वाक्य में अंतिम शब्द है और पहले कॉलम में सब कुछ शामिल है।

x <- c("This is a test", 
     "Testing 1,2,3 Hello", 
     "Foo Bar", 
     "Random 214274(%*(^(* Sample", 
     "Some Hyphenated-Thing" 
     ) 

इस तरह की है कि मैं के साथ अंत:

col1       col2 
this is a     test 
Testing 1,2,3    Hello 
Foo       Bar 
Random 214274(%*(^(*   Sample 
Some       Hyphenated-Thing 

उत्तर

9

यह आगे देखने के लिए एक नौकरी की तरह दिखता है। हम उन चीजों के बाद रिक्त स्थान पाएंगे जो रिक्त स्थान नहीं हैं।

do.call(rbind, 
    lapply(
    strsplit(x," "), 
    function(y) 
     cbind(paste(head(y,length(y)-1),collapse=" "),tail(y,1)) 
    ) 
) 

या एक विकल्प के कार्यान्वयन sapply

t(
    sapply(
    strsplit(x," "), 
    function(y) cbind(paste(head(y,length(y)-1),collapse=" "),tail(y,1)) 
) 
) 

का उपयोग करने में परिणामी:

split <- strsplit(x, " (?=[^ ]+$)", perl=TRUE) 
matrix(unlist(split), ncol=2, byrow=TRUE) 

    [,1]     [,2]    
[1,] "This is a"   "test"    
[2,] "Testing 1,2,3"  "Hello"   
[3,] "Foo"     "Bar"    
[4,] "Random 214274(%*(^(*" "Sample"   
[5,] "Some"     "Hyphenated-Thing" 
+0

+1 और गति के लिए चेकमार्क (प्रतिनिधि (10k) = 0.05 एस) –

1

"शब्द" यह मानते हुए कर रहे हैं अल्फान्यूमेरिक (इस मामले में अंतिम शब्द एक या पत्र \\w या अंक \\d, आप यदि आवश्यक हो तो अधिक कक्षाएं जोड़ सकते हैं):

col_one = gsub("(.*)(\\b[[\\w\\d]+)$", "\\1", x, perl=TRUE) 
col_two = gsub("(.*)(\\b[[\\w\\d]+)$", "\\2", x, perl=TRUE) 

आउटपुट:

> col_one 
[1] "This is a "   "Testing 1,2,3 "  "Foo "     
[4] "Random 214274(%*(^(* " 
> col_two 
[1] "test" "Hello" "Bar" "Sample" 
+0

ऐसा लगता है कि काम कर रहा है, लेकिन यदि अंतिम "शब्द" में ''' है, तो इसके लिए यह जिम्मेदार नहीं है। मैं अपना उदाहरण अपडेट कर रहा हूं। –

+0

यही वह है जो मैं अपनी व्याख्या के साथ प्राप्त करने की कोशिश कर रहा था: मुझे यकीन नहीं था कि शब्दों में क्या हो सकता है, इसलिए मैंने '\\ w \\ d' का उपयोग किया। आप उस भाग को '\\ S' के साथ बदलने से बेहतर हो सकते हैं: किसी भी चरित्र जो व्हाइटस्पेस नहीं है। – Marius

+0

'\\ W \\ d' को '\\ S' के साथ बदलकर मेरे लिए काम नहीं किया। यह हाइफेनेटेड अंत शब्दों के अपवाद के साथ कार्य करता है। –

4

यहाँ एक जाना strsplit का उपयोग कर

 [,1]     [,2]    
[1,] "This is a"   "test"    
[2,] "Testing 1,2,3"  "Hello"   
[3,] "Foo"     "Bar"    
[4,] "Random 214274(%*(^(*" "Sample"   
[5,] "Some"     "Hyphenated-Thing" 
+0

+1 पूरी तरह कार्यात्मक। –

0

यह नहीं हो सकता है वास्तव में आप के लिए हो सकता है, लेकिन इस मामले में किसी को भी सोच रहा था कि कैसे अजगर में यह करने के लिए:

#col1: 
print line.split(" ")[:-1] 

#col2: 
print line.split(" ")[-1] 

ध्यान दें कि col1 एक सूची है, जो आपको इस तरह की एक स्ट्रिंग में कर सकते हैं के रूप में मुद्रित हो जाएगी:

#col1: 
print " ".join(line.split(" ")[:-1]) 
संबंधित मुद्दे