2016-07-13 11 views
0

Ich versuche, alle Instanzen eines Musters in einem Vektor von Zeichenfolgen zu identifizieren. Ich freue mich auf so etwas wie dieses:Identifizieren Sie Instanzen eines Musters in einem Zeichenvektor in R

fruits <- c("Cherry", "Grape", "Orange", "Lemon") 
    pattern <- c("Lemon", "Grape", "Cherry", "Grape") 
    full <- sample(fruits, 1000, replace = TRUE) 

Ich möchte nur jede Instanz pattern in full zu finden. Mein inneres Java-Baby sagt, dass man sich in der Schleife bewegen soll, so etwas wie das vielleicht?

for(i in 1:(length(full)-length(pattern))) { 
     if(full[i] == pattern[1]) { 
     if(full[i+1] == pattern[2]) { 
      ... 

Und dann speichern Sie die Indizes. Aber das scheint mir nicht sehr oder sehr effizient zu sein. Ist das der richtige Weg, oder kann mich jemand auf eine Funktion oder ein Paket hinweisen, die das einfacher/schneller machen?

edit: Sorry, ich bin nicht klar zu sein, muss ich wissen, wo pattern beginnt in full, das heißt, wenn irgendwo in full etwas wie folgt aussehen endet:

... 
    [177] "Lemon" "Grape " "Cherry" "Grape" "Grape" "Lemon" "Cherry" "Grape" "Lemon" "Cherry" "Orange" 
    ... 

Dann ein Ich hätte Weg, diesen Index zu finden (177), da das Muster (Zitrone, Traube, Kirsche, Traube) dort erscheint und dort anfängt. Dann würde ich idealerweise, wenn das Muster später wieder auftauchen würde, auch alle Instanzen von pattern finden.

+0

Ich glaube [this] (http://stackoverflow.com/questions/33027611/how-to-index-a-vector-sequence-within-a-vector-sequence) sollte ähnlich sein –

+0

Eigentlich vielleicht ignorieren Sie die Bearbeitung Ich glaube, du hast mich hier abgedeckt. – etaylor

Antwort

2

Folgendes sollte funktionieren.

which(full %in% pattern) 
0

Es ist nicht ganz klar zu mir, was Sie suchen, aber

l = apply(sapply(full, grepl, pattern), 1, function(x) { (1:length(full))[x] }) 
names(l) = pattern 

finden Sie eine Liste der gleichen Länge wie Elemente in pattern, Indexierung geben, wo in full dass pattern zu sehen ist. Ich benutze grepl, weil pattern impliziert Zeichenfolge entspricht mir, die

sein könnte Wenn es nicht teilweise String-Matching ist, wird %in% definitiv schneller sein.

Verwandte Themen