2012-04-11 20 views

Antwort

5

Hier ist eine Idee, die zu verallgemeinern wäre einfach:

text<- c("i was happy yesterday :):)", 
     "i am happy today :)", 
     "will i be happy tomorrow?") 

(nchar(text) - nchar(gsub(":)", "", text)))/2 
# [1] 2 1 0 
+1

Sie könnten auch das Gegenteil für nur einen 'nchar() 'Aufruf verwenden:' nchar (gsub ("[^ :)]", "", Text))/2' –

+0

@SachaEpskamp - Leider doesn nicht tue genau dasselbe, da es alles außer den Zeichen ':' und ')' ersetzt, wenn du wirklich alles ersetzen wolltest, außer der * string * ':)'. Versuchen Sie Ihre Idee mit 'text <-" A: "', um zu sehen, was ich meine. –

+1

Richtig danke. Ich bin mit regulären Ausdrücken ziemlich neu. Ich denke, das funktioniert? 'nchar (gsub ("^((?!: \\)).) * "," ", text, perl = TRUE))/2' –

1

Dies funktioniert der Trick, aber vielleicht nicht das Beste sein direkte Art und Weise:

mytext<- "i am happy today :):)" 

# The following line inserts semicolons to split on 
myTextSub<-gsub(":)", ";:);", mytext) 

# Then split and unlist 
myTextSplit <- unlist(strsplit(myTextSub, ";")) 

# Then see how many times the smiley turns up 
length(grep(":)", myTextSplit)) 

EDIT

Vektoren von Text behandeln mit einer Länge von> 1, nicht fehlendem oder:

mytext<- rep("i am happy today :):)",2) 
myTextSub<-gsub(":\\)", ";:\\);", mytext) 
myTextSplit <- strsplit(myTextSub, ";") 

sapply(myTextSplit,function(x){ 
    length(grep(":)", x)) 
}) 

Aber Ich mag die anderen Antworten besser.

3

Ich nehme an, Sie nur die Zählung, oder wollen Sie auch :) aus dem String entfernen?

Für die Zählung können Sie tun:

length(gregexpr(":)",text)[[1]]) 

, die für einen Vektor von Strings ist 2. Eine allgemeinere Lösung gibt:

sapply(gregexpr(":)",text),length) 

Edit:

Josh O'Brien darauf hingewiesen, dass dies auch 1 zurück gibt es keine :) seit gregexpr gibt -1 in diesem Fall zurück. Um das zu beheben, können Sie verwenden:

sapply(gregexpr(":)",text),function(x)sum(x>0)) 

Das wird etwas weniger schön.

+0

Dies ist eine großartige Idee, aber es braucht ein bisschen mehr Arbeit, da es für Strings fehlschlägt, die kein '" "enthalten Saiten überhaupt. (Probieren Sie Ihre Funktionen beispielsweise mit 'text <-" ABC "aus, um zu sehen, dass beide" behaupten ", dass sie ein Smiley-Gesicht enthält.) Das liegt daran, dass' gregexpr() '' -1' für eine solche Zeichenfolge zurückgibt , die eine Länge von 1 hat. Ich denke, dass eine feste Version Ihres Ansatzes eine sauberere Lösung wäre als die, die ich vorgeschlagen habe ... –

+0

Edited, thanks. –

+0

Kühl. Ich werde dies als ein gutes Beispiel für die Art von Problem ablegen, wo 'gregexpr()' sich auszeichnet. –

Verwandte Themen