Ich habe einen data.frame, in dem bestimmte Variablen eine Textzeichenfolge enthalten. Ich möchte die Anzahl der Vorkommen eines bestimmten Zeichens in jeder einzelnen Zeichenfolge zählen.
Beispiel:
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"))
Ich möchte eine neue Spalte für q.data mit der Häufigkeit des Auftretens von "a" in der Zeichenfolge (dh c (2,1,0)) erstellen.
Der einzige verschlungene Ansatz, den ich geschafft habe, ist:
string.counter<-function(strings, pattern){
counts<-NULL
for(i in 1:length(strings)){
counts[i]<-length(attr(gregexpr(pattern,strings[i])[[1]], "match.length")[attr(gregexpr(pattern,strings[i])[[1]], "match.length")>0])
}
return(counts)
}
string.counter(strings=q.data$string, pattern="a")
number string number.of.a
1 1 greatgreat 2
2 2 magic 1
3 3 not 0
stringsAsFactors = FALSE
beim Definieren des Datenrahmens hinzugefügt habe .stringsAsFactors=TRUE
auf meinem Comp getan, aber das nicht erwähntWenn Sie die Basis R nicht verlassen möchten, ist hier eine ziemlich prägnante und ausdrucksstarke Möglichkeit:
quelle
regmatches
undgregexpr
zusammen ein paar Mal verwendet haben, aber diese Kombination ist stark genug, dass ich dachte, sie hätte einen Stecker verdient.regmatches
ist relativ neu. Es wurde in 2.14 eingeführt.Beachten Sie, dass ich die Faktorvariable zum Zeichen zwinge, bevor ich zu nchar übergebe. Die Regex-Funktionen scheinen dies intern zu tun.
Hier sind die Benchmark-Ergebnisse (mit einer auf 3000 Zeilen vergrößerten Größe des Tests)
quelle
fixed=TRUE
an übergeben wirdgsub
. Es gibt auch Fälle, in denenfixed=TRUE
dies erforderlich wäre (dh wenn das zu zählende Zeichen als Regex-Behauptung interpretiert werden könnte, wie z. B..
).ist eine gute Option.
quelle
Das
stringi
Paket bietet die Funktionenstri_count
undstri_count_fixed
die sind sehr schnell.Benchmark
Verglichen mit dem schnellsten Ansatz aus der Antwort von @ 42- und der entsprechenden Funktion aus dem
stringr
Paket für einen Vektor mit 30.000 Elementen.Daten
quelle
Eine Variation von https://stackoverflow.com/a/12430764/589165 ist
quelle
Ich bin sicher, jemand kann es besser machen, aber das funktioniert:
oder in einer Funktion:
quelle
Sie können einfach die Zeichenfolgenteilung verwenden
Das gibt Ihnen 1, 3, 1, 0. Sie können auch die Zeichenfolgenteilung mit regulären Ausdrücken und ganzen Wörtern verwenden.
quelle
Der einfachste und sauberste Weg ist meiner Meinung nach:
quelle
lengths(gregexpr('a', q.data$string))
kehrt2 1 1
nicht zurück2 1 0
.Die folgende Frage wurde hierher verschoben, aber es scheint, dass diese Seite Farah Els Frage nicht direkt beantwortet. So finden Sie die Nummer 1 in 101 in R.
Also schreibe ich hier eine Antwort, nur für den Fall.
https://stackoverflow.com/users/8931457/farah-el
quelle
Eine weitere
base R
Option könnte sein:quelle
Der nächste Ausdruck erledigt die Aufgabe und funktioniert auch für Symbole, nicht nur für Buchstaben.
Der Ausdruck funktioniert wie folgt:
quelle
Vielleicht nicht die effizienteste, aber ich löse meinen Zweck.
quelle