2016-05-05 2 views

Antwort

1

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 
1

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.

3

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 
+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

+0

Das scheint falsch, wenn es kein "abcd" gibt. Die Ausgabe wird 1 eher 0 sein. Stripl :: str_count funktioniert. –

+0

@Gopata, Es funktioniert auch für eine Spalte. Siehe 2. Beispiel. –

Verwandte Themen