2013-03-21 8 views
5

YARQ (Ancora un'altra domanda di regex).Dividi colonna per ultima parola nella frase

Come dovrei andare a suddividere il seguente in due colonne, assicurandosi che l'ultima colonna contenga l'ultima parola nella frase e la prima colonna contenga tutto il resto.

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

Tale che io alla fine con:

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

risposta

9

Questo sembra un lavoro per guardare avanti. Troveremo spazi seguiti da cose che non sono spazi.

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 e segno di spunta per la velocità (rep (10k) = 0.05 s) –

1

Supponendo "parole" sono alfanumerico (l'ultima parola in questo caso è di uno o lettere \\w oi numeri \\d, è possibile aggiungere più classi, se necessario,):

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

uscita:

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

Questo sembra funzionare, ma se l'ultima "parola" ha un '-' in esso, non ne tiene conto. Sto aggiornando il mio esempio. –

+0

Questo è quello che stavo cercando di ottenere con la mia spiegazione: non ero sicuro di cosa potesse essere esattamente nelle parole, quindi ho usato '\\ w \\ d'. Potrebbe essere meglio sostituire la parte con '\\ S': qualsiasi carattere che non sia uno spazio bianco. – Marius

+0

Sostituire '\\ W \\ d' con' \\ S' non ha funzionato per me. Funziona con l'eccezione delle parole finali con trattino. –

4

Ecco un andare con strsplit:

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

O un'implementazione alternativa usando sapply

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

Con conseguente:

 [,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 completamente funzionante. –

0

questo non potrebbe esattamente essere per voi, ma nel caso qualcuno si chiedeva come farlo in python:

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

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

Nota che col1 otterrà stampata come una lista, che si può fare in una stringa come questa:

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