2014-10-07 15 views
11

Chciałbym napisać polecenie strsplit, które chwyta pierwsze ")" i dzieli ciąg znaków.R: strsplit na pierwszej instancji

Na przykład:

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

Czytałem w kilku innych pokrewnych regex SO pytania, ale obawiam się, że nie jestem w stanie dokonać monetą z tego. Dziękuję Ci za pomoc.

Odpowiedz

10

można uzyskać ten sam rezultat lista typu jak byś z strsplit jeśli użyto regexpr aby uzyskać pierwsze dopasowanie, a następnie odwrócony wynik regmatches.

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

Zastąp pierwszy znak ( znakiem niedrukowalnym "\01", a następnie podświetl go. Możesz użyć dowolnego znaku, który lubisz zamiast "\01", o ile nie pojawi się.

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

Dzięki sugestii, ale jest to niebezpieczne, ponieważ w ogóle może istnieć przecinek przed ')' takich jak 'strsplit (pod (") ",", ",", 12) 34) 56 "), ",") '. – fsmart

+0

Zobacz wersję. –

2

Inną opcją jest użycie str_split w pakiecie stringr:

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

Potrzeba prędkości? Następnie przejdź do funkcji stringi. Zobacz czasy, np. here.

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

To może być bezpieczniej zidentyfikować gdzie znak jest i wtedy podciąg obu jej stronach:

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