2014-07-24 16 views
8

Non sono nuovo a R, ma sono relativamente nuovo all'espressione regolare.divisione stringa sull'ultima virgola in R

Una domanda simile può essere trovata in here.

Un esempio è se io uso

> strsplit("UK, USA, Germany", ", ") 
[[1]] 
[1] "UK"  "USA"  "Germany" 

ma voglio ottenere

[[1]] 
[1] "UK, USA"  "Germany" 

Un altro esempio è

> strsplit("London, Washington, D.C., Berlin", ", ") 
[[1]] 
[1] "London"  "Washington" "D.C."  "Berlin" 

e voglio ottenere

[[1]] 
[1] "London, Washington, D.C."  "Berlin" 

Definitivamente Washington, D.C. non deve essere diviso in due parti e diviso solo dall'ultima virgola, non ogni virgola.

Un valido modo penso che è quello di sostituire l'ultima virgola da qualcos'altro, come

$, #, *, ... 

quindi utilizzare

strsplit() 

per dividere la stringa da colui è stato sostituito (Assicurarsi che sia unico!), ma sono più felice se riesci ad affrontare il problema utilizzando direttamente alcune funzioni incorporate.

Quindi, come posso farlo? molte grazie

risposta

9

Ecco un approccio:

strsplit("UK, USA, Germany", ",(?=[^,]+$)", perl=TRUE) 

## [[1]] 
## [1] "UK, USA" " Germany" 

Si consiglia:

strsplit("UK, USA, Germany", ",\\s*(?=[^,]+$)", perl=TRUE) 

## [[1]] 
## [1] "UK, USA" "Germany" 

Come sarà corrisponde se non c'è spazio dopo la virgola:

strsplit(c("UK, USA, Germany", "UK, USA,Germany"), ",\\s*(?=[^,]+$)", perl=TRUE) 

## [[1]] 
## [1] "UK, USA" "Germany" 
## 
## [[2]] 
## [1] "UK, USA" "Germany" 
+0

Grazie, questo è OK, ma didn' t togli la seconda virgola ... è molto meglio rimuovere la seconda virgola. –

+0

Grazie mille, amico! Qualche suggerimento o sito web per imparare le basi della regolare espressione in R? –

+1

Due posti: prendo molto qui su SO e http://www.regular-expressions.info/rlanguage.html –

5

Puoi utilizzare la funzione stri_split dal pacchetto stringi

x <- "USA,UK,Poland" 
stri_split_fixed(x,",") # standard split by comma 
[[1]] 
[1] "USA" "UK"  "Poland" 

stri_split_fixed(x,",",n = 2) # set the max number of elements 
[[1]] 
[1] "USA"  "UK,Poland" 

Purtroppo non esiste un parametro per cambiare il punto di partenza per la scissione (dall'inizio/fine), ma siamo in grado di gestire questo un altro modo - usando stri_reverse

stri_split_fixed(stri_reverse(x),",",n = 2) #reverse 
[[1]] 
[1] "dnaloP" "KU,ASU" 

stri_reverse(stri_split_fixed(stri_reverse(x),",",n = 2)[[1]]) #reverse back 
[1] "Poland" "USA,UK" 
stri_reverse(stri_split_fixed(stri_reverse(x),",",n = 2)[[1]])[2:1] #and again :) 
[1] "USA,UK" "Poland" 
Problemi correlati