2012-04-25 13 views
8

Come posso dividere in modo efficiente la seguente stringa sulla prima virgola utilizzando la base?Dividi sulla prima virgola nella stringa

x <- "I want to split here, though I don't want to split elsewhere, even here." 
strsplit(x, ???) 

Risultato desiderato (2 stringhe):

[[1]] 
[1] "I want to split here" "though I don't want to split elsewhere, even here." 

Grazie in anticipo.

EDIT: Non ho pensato di dirlo. Questo deve essere in grado di generalizzare ad una colonna, vettore di stringhe come questo, come in:

y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.") 

Il risultato può essere due colonne o una lunga vettore (che posso prendere ogni altro elemento) o un elenco di punture con ciascun indice ([[n]]) con due stringhe.

Ci scusiamo per la mancanza di chiarezza.

+0

estremamente hacky, ma per quanto riguarda qualcosa come 'lista (testa (y [[1]], 1), pasta (coda (y [[1]], - 1), collasso = "")) dove 'y' è l'output di' strsplit (x, ...) '? – Chase

+0

Chase l'ho provato ma non riuscivo a farlo funzionare per un vettore di stringhe simili.Ho modificato il mio post originale per spiegare ulteriormente il problema. –

+0

il 'str_locate_all (string = y, ',')' troverà tutte le posizioni dell'indice del tuo pattern (virgola nel tuo caso) che possono quindi essere applicate per selezionare il vettore o la colonna. – John

risposta

11

Ecco quello che probabilmente farei. Può sembrare un hacker, ma dal momento che i modelli sub() e strsplit() sono entrambi vettorizzati, funzionerà anche in modo fluido quando si passano più stringhe.

XX <- "SoMeThInGrIdIcUlOuS" 
strsplit(sub(",\\s*", XX, x), XX) 
# [[1]] 
# [1] "I want to split here"        
# [2] "though I don't want to split elsewhere, even here." 
+0

@ josh-obrien Come estendere tale codice per tagliare lo spazio iniziale in [2]. – John

+1

Lo abbraccerò con 'gsub ("^\\ s + | \\ s + $ "," ", JOSH's STUFF)' –

+0

Mi piace Josh. Funziona ed è piuttosto semplice e rimane in base. grazie. +1 –

2

library(stringr)

str_sub(x,end = min(str_locate(string=x, ',')-1))

questo otterrà il primo bit che si desidera. Cambia il start= e end= in str_sub per ottenere quello che vuoi.

Come ad esempio:

str_sub(x,start = min(str_locate(string=x, ',')+1))

e avvolgere in str_trim per sbarazzarsi dello spazio iniziale:

str_trim(str_sub(x,start = min(str_locate(string=x, ',')+1)))

2

Questo funziona, ma mi piace di Josh Obrien meglio:

y <- strsplit(x, ",") 
sapply(y, function(x) data.frame(x= x[1], 
    z=paste(x[-1], collapse=",")), simplify=F)) 

Ispirato dalla risposta di caccia.

Un certo numero di persone ha dato non di base si avvicina così ho dato mi piacerebbe aggiungere quello che di solito uso (anche se in questo caso avevo bisogno di una risposta di base):

y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.") 
library(reshape2) 
colsplit(y, ",", c("x","z")) 
+0

Nella tua prima parte non vedo perché dovresti usare tranquillamente il seq_along (y) invece di solo y. Non sembra che tu abbia mai realmente bisogno dell'indice esplicitamente. Sembra che tu stia rimuovendo tutte le virgole anche se volevi che venissero conservate nelle altre stringhe? – Dason

+0

@Dason L'ho risolto –

8

Dal pacchetto stringr:

str_split_fixed(x, pattern = ', ', n = 2) 
#  [,1]     
# [1,] "I want to split here" 
#  [,2]             
# [1,] "though I don't want to split elsewhere, even here." 

(Questa è una matrice con una riga e due colonne.)

3

Ecco un'altra soluzione, con un'espressione regolare per catturare ciò che è prima e dopo la prima virgola

x <- "I want to split here, though I don't want to split elsewhere, even here." 
library(stringr) 
str_match(x, "^(.*?),\\s*(.*)")[,-1] 
# [1] "I want to split here"        
# [2] "though I don't want to split elsewhere, even here." 
Problemi correlati