2017-02-22 7 views
6

Ich versuche, die Zahl der offenen Klammern in einer Zeichenkette in R. zu bekommen Ich bin mit der str_count Funktion aus dem stringr Paketzählt die Anzahl der Vorkommen von „(“ in einem String

s<- "(hi),(bye),(hi)" 
str_count(s,"(") 

Fehler in stri_count_regex (string, Muster, opts_regex = attr (Muster, . `falsch verschachtelte Klammern in regexp Muster (U_REGEX_MISMATCHED_PAREN)

ich hoffe 3 zu erhalten für Dieses Beispiel

+0

Flucht es 'str_count (s, "\\ (")' – Sotos

Antwort

5

( ist ein Sonderzeichen. Sie müssen es entkommen:

> str_count(s,"\\(") 
[1] 3 

Alternativ, da Sie verwenden stringr, können Sie die coll Funktion:

str_count(s,coll("(")) 
[1] 3 
2

Wenn Sie es in der Basis R tun wollen Sie in aufspalten ein Vektor der einzelnen Zeichen und direkt die "(" zählen (ohne es als regulärer Ausdruck darstellt):

> s<- "(hi),(bye),(hi)" 
> chars <- unlist(strsplit(s,"")) 
> length(chars[chars == "("]) 
[1] 3 
+2

oder dies 'nchar (s) - nchar (gsub ('\\ (', '', s))' für die Basis R – Sotos

+0

@Sotos Das funktioniert auch. –

2

Sie auchnutzen könntenzusammen mit length in Basis R:

sum(gregexpr("(", s, fixed=TRUE)[[1]] > 0) 
[1] 3 

gregexpr nimmt in einem Zeichenvektor und gibt eine Liste mit den Anfangspositionen jedes Spiel. Ich fügte fixed = TRUE hinzu, um Literalen zu entsprechen. length wird nicht funktionieren, da gregexpr -1 zurückgibt, wenn ein Unterausdruck nicht gefunden wird.


Wenn Sie ein Zeichen Vektor der Länge größer als eins haben, müssten Sie das Ergebnis sapply füttern:

# new example 
s<- c("(hi),(bye),(hi)", "this (that) other", "what") 
sapply((gregexpr("(", s, fixed=TRUE)), function(i) sum(i > 0)) 
[1] 3 1 0 
Verwandte Themen