2014-10-07 2 views
11

Vorrei scrivere un comando strsplit che acquisisca il primo ")" e divida la stringa.R: strsplit in prima istanza

Ad esempio:

f("12)34)56") 
"12" "34)56" 

Ho letto su diversi altri correlata regex SO domande, ma ho paura che non sono in grado di fare testa o croce di questo. Grazie a qualsiasi assistenza.

risposta

10

si potrebbe ottenere lo stesso risultato elenco di tipo come si farebbe con strsplit se utilizzato regexpr per ottenere la prima corrispondenza e quindi il risultato invertito di regmatches.

x <- "12)34)56" 
regmatches(x, regexpr(")", x), invert = TRUE) 
# [[1]] 
# [1] "12" "34)56" 
2

Sostituire il primo ( con il carattere non di stampa "\01" e quindi strsplit su quello. Puoi utilizzare qualsiasi personaggio che ti piace al posto di "\01" finché non viene visualizzato.

strsplit(sub(")", "\01", "12)34)56"), "\01") 
+0

Grazie al suggerimento ma questo è pericoloso perché, in generale, ci potrebbe essere una virgola prima della ')' come 'strsplit (sub (")",", "", 12) 34) 56"), ",") '. – fsmart

+0

Vedere la revisione. –

2

Un'altra opzione è quella di utilizzare str_split nel pacchetto stringr:

library(stringr) 
f <- function(string) 
{ 
    unlist(str_split(string,"\\)",n=2)) 
} 
> f("12)34)56") 
[1] "12" "34)56" 
4

bisogno di velocità? Quindi vai per le funzioni stringi. Vedi orari ad es. here.

library(stringi) 
x <- "12)34)56" 
stri_split_fixed(str = x, pattern = ")", n = 2) 
5

Potrebbe essere più sicuro per identificare dove il personaggio è e quindi sottostringa entrambi i lati di esso:

x <- "12)34)56" 
spl <- regexpr(")",x) 
substring(x,c(1,spl+1),c(spl-1,nchar(x))) 
#[1] "12" "34)56"