2013-03-24 8 views
5

, wenn ich einen VektorHäufigkeit der Zeichenfolge bestimmen grep

x <- c("ajjss","acdjfkj","auyjyjjksjj") 

haben und zu tun:

y <- x[grep("jj",x)] 
table(y) 

ich:

y 
     ajjss auyjyjjksjj 
      1   1 

jedoch die zweite Zeichenfolge "auyjyjjksjj" zählen sollte der Teilstring "jj" zweimal. Wie kann ich dies von einer echten/falschen Berechnung ändern, um die Häufigkeit von "jj" tatsächlich zu zählen?

Auch wenn für jeden String die Frequenz des Teilstrings geteilt durch die Länge des Strings berechnet werden könnte, wäre das großartig.

Vielen Dank im Voraus.

Antwort

8

Ich löste dies mit gregexpr()

x <- c("ajjss","acdjfkj","auyjyjjksjj") 
freq <- sapply(gregexpr("jj",x),function(x)if(x[[1]]!=-1) length(x) else 0) 
df<-data.frame(x,freq) 

df 
#   x freq 
#1  ajjss 1 
#2  acdjfkj 0 
#3 auyjyjjksjj 2 

Und für den letzten Teil der Frage, Berechnung Frequenz/Stringlänge ...

df$rate <- df$freq/nchar(as.character(df$x)) 

Es ist nece sssary, um df $ x zurück in eine Zeichenkette zu konvertieren, da data.frame (x, freq) Zeichenketten automatisch in Faktoren umwandelt, es sei denn, Sie geben stringsAsFactors = F an.

df 
#   x freq  rate 
#1  ajjss 1 0.2000000 
#2  acdjfkj 0 0.0000000 
#3 auyjyjjksjj 2 0.1818182 
+0

das ist ausgezeichnet, danke. Ich merke, dass Sie die Länge der Zeichenfolge berechnen - im data.frame kann ich die Frequenz/Länge aufrufen? das wäre sehr nützlich. Vielen Dank. – brucezepplin

+0

oh tut mir leid - was ich meine ist, kann ich für jede Zeichenfolge die Frequenz der Teilzeichenfolge durch die Zeichenfolgenlänge zurückgegeben? – brucezepplin

+0

sorry - ich; m bekomme Fehler in nchar (df $ x): 'nchar()' benötigt einen Zeichenvektor – brucezepplin

7

Sie verwenden das falsche Werkzeug. Versuchen Sie gregexpr, mit dem Sie die Positionen geben, wo der Suchbegriff gefunden wurde (oder -1, wenn nicht gefunden):

> gregexpr("jj", x, fixed = TRUE) 
[[1]] 
[1] 2 
attr(,"match.length") 
[1] 2 
attr(,"useBytes") 
[1] TRUE 

[[2]] 
[1] -1 
attr(,"match.length") 
[1] -1 
attr(,"useBytes") 
[1] TRUE 

[[3]] 
[1] 6 10 
attr(,"match.length") 
[1] 2 2 
attr(,"useBytes") 
[1] TRUE 
+0

Vielen Dank, das war sehr hilfreich. – brucezepplin

+0

die position ist eigentlich sehr nützlich für mich jetzt denke ich darüber nach. Vielen Dank. – brucezepplin

3

Sie verwenden qdap können (wenn auch nicht in der Basis R installieren):

x <- c("ajjss","acdjfkj","auyjyjjksjj") 
library(qdap) 
termco(x, seq_along(x), "jj") 

## > termco(x, seq_along(x), "jj") 
## x word.count   jj 
## 1 1   1 1(100.00%) 
## 2 2   1   0 
## 3 3   1 2(200.00%) 

Beachten Sie, dass die Ausgangsfrequenz und die Frequenz im Vergleich zu Wortanzahl (ist die Ausgabe eine Liste tatsächlich aber druckt eine ziemlich Ausgabe). Um die Frequenzen zugreifen:

termco(x, seq_along(x), "jj")$raw 

## > termco(x, seq_along(x), "jj")$raw 
## x word.count jj 
## 1 1   1 1 
## 2 2   1 0 
## 3 3   1 2 
2

Dieser einfache Einzeiler in base r Verwendung von strsplit macht und dann Grepl, und ist ziemlich robust, aber brechen, wenn es Spiele zu zählen wie jjjjjj als 3 Los jj hat. Die Musterübereinstimmung, die das ermöglicht, ist von @JoshOBriens excellent Q&A:

sum(grepl("jj" , unlist(strsplit(x , "(?<=.)(?=jj)" , perl = TRUE)))) 



# Examples.... 
f<- function(x){ 
    sum(grepl("jj" , unlist(strsplit(x , "(?<=.)(?=jj)" , perl = TRUE)))) 
    } 

    #3 matches here 
    xOP <- c("ajjss","acdjfkj","auyjyjjksjj") 
    f(xOP) 
    # [1] 3 

    #4 here 
    x1 <- c("ajjss","acdjfkj", "jj" , "auyjyjjksjj") 
    f(x1) 
    # [1] 4 

    #8 here 
    x2 <- c("jjbjj" , "ajjss","acdjfkj", "jj" , "auyjyjjksjj" , "jjbjj") 
    f(x2) 
    # [1] 8 

    #Doesn't work yet with multiple jjjj matches. We want this to also be 8 
    x3 <- c("jjjj" , "ajjss","acdjfkj", "jj" , "auyjyjjksjj" , "jjbjj") 
    f(x3) 
    # [1] 7 
+0

Dies wirft einen wichtigen Punkt auf - die akzeptierte Antwort hat dies gelöst. Wenn ich "jjjjjj" hätte, würde ich eine Frequenz von 3 zurückgeben wollen. Ich nehme jedoch an, dass dies ein Problem wäre, wenn ich Überlappungen in der Häufigkeitszählung erlaubte, die mir eine Häufigkeit von 5 gab. Glücklicherweise ist dies nicht der Fall! Aber danke, dass du das aufgezeigt hast. – brucezepplin