nehme an, ich habe eine lange Schnur so wie:Count Anzahl von kurzen Zeichenketten in einer langen Reihe in R
c<-"abcabcdabcdeabcdefghijkabcdabcaba"
Meine Frage ist, wie schnell die Anzahl der genauen „ABCD“ in c
zählen.
nehme an, ich habe eine lange Schnur so wie:Count Anzahl von kurzen Zeichenketten in einer langen Reihe in R
c<-"abcabcdabcdeabcdefghijkabcdabcaba"
Meine Frage ist, wie schnell die Anzahl der genauen „ABCD“ in c
zählen.
Mit Bibliothek stringr
eins größer als die Anzahl der ABCD-Muster sind, können Sie es tun wie folgt (auf größeren Satz, wird es ziemlich schnell sein und effizient):
library(stringr)
c <- "abcabcdabcdeabcdefghijkabcdabcaba"
c
[1] "abcabcdabcdeabcdefghijkabcdabcaba"
str_count(c, 'abcd')
[1] 4
Diese auf einer Säule eines Datenrahmens funktioniert wie folgt:
df <- data.frame(txt = rep(c, 10))
df$abcd_count <- str_count(df$txt, 'abcd')
df
txt abcd_count
1 abcabcdabcdeabcdefghijkabcdabcaba 4
2 abcabcdabcdeabcdefghijkabcdabcaba 4
3 abcabcdabcdeabcdefghijkabcdabcaba 4
4 abcabcdabcdeabcdefghijkabcdabcaba 4
5 abcabcdabcdeabcdefghijkabcdabcaba 4
6 abcabcdabcdeabcdefghijkabcdabcaba 4
7 abcabcdabcdeabcdefghijkabcdabcaba 4
8 abcabcdabcdeabcdefghijkabcdabcaba 4
9 abcabcdabcdeabcdefghijkabcdabcaba 4
10 abcabcdabcdeabcdefghijkabcdabcaba 4
Hier wird ein Verfahren unter Verwendung einer Base Rs gsub
und strsplit:
# example
temp <- "abcabcdabcdeabcdefghijkabcdabcaba"
# substitute pattern for character not in string, here 9
temp2 <- gsub("abcd", "9", temp)
# split on 9, and count number of elements
length(strsplit(temp2, split="9")[[1]]) - 1
Sie müssen die [[1]]
weil strsplit
ausgelegt Vektoren von Strings für den Betrieb über, hier der Vektor der Länge 1. Eine Alternative zu [[ 1]] in diesem Fall ist unlist
.
Auch 1 subtrahiert wird, weil die Anzahl der Elemente von 1.
1) gregexpr Zuerst einfügen "abcd"
auf c
, so dass es mindestens 1 Übereinstimmung gibt. (Dies ist erforderlich, da gregexpr
-1 für eine beliebige Komponente von c
mit keinen Übereinstimmungen anstelle eines numerischen Nullvektors zurückgibt.) gregexpr
gibt jetzt eine Liste zurück, deren Komponenten numerische Vektoren der Anfangspositionen der Übereinstimmungen einer Komponente pro Komponente von c
sind - In diesem Fall hat c
nur eine Komponente, aber der Code unten funktioniert allgemeiner. Finden Sie nun die Längen der Komponenten des Ergebnisses von gregexpr
und subtrahieren Sie 1, um die zusätzlichen abcd
, die wir hinzugefügt haben, zu berücksichtigen. Keine Pakete werden verwendet.
Beispiel 1
lengths(gregexpr("abcd", paste(c, "abcd"))) - 1
## [1] 4
Hinweis: Wenn wir wussten, dass es mindestens ein Spiel war es etwas vereinfacht werden könnte: lengths(gregexpr("abcd", c))
. 2
Beispiel
Hier ist ein weiteres Beispiel. Hier DF
hat 3 Zeilen und die entsprechenden Komponenten c
haben 4, 4 und 0 Vorkommen von "abcd"
.
DF <- data.frame(c = c(c, c, "X")) # test input
lengths(gregexpr("abcd", paste(DF$c, "abcd"))) - 1
## [1] 4 4 0
2) regmatches
Hier ist ein alternativer Ansatz. Dieser Ansatz hat den Vorteil, dass kein spezieller Code für den Fall ohne Übereinstimmung benötigt wird. Auch hier werden keine Pakete verwendet.
Hier sind die gleichen zwei Beispiele:
lengths(regmatches(c, gregexpr("abcd", c)))
## [1] 4
lengths(regmatches(DF$c, gregexpr("abcd", DF$c)))
## [1] 4 4 0
Wenn Sie eine Spalte von Saiten haben anstelle eines einzelnen Zeichen Vektor 'c' zu entsprechen, würde die Länge nicht erforderlich 'apply' Familie Funktion zu berechnen pro Reihe? – Gopala
Das scheint falsch, wenn es kein "abcd" gibt. Die Ausgabe wird 1 eher 0 sein. Stripl :: str_count funktioniert. –
@Gopata, Es funktioniert auch für eine Spalte. Siehe 2. Beispiel. –