2016-07-19 6 views
0

Ich habe eine Spalte innerhalb eines Datenrahmens Langtextsequenzen enthalten (oft in den Tausenden von Zeichen) des Format:Wie ersetzen Sie Textfolgen, die in einem festen Muster enden, innerhalb einer langen Textzeichenfolge in R?

abab(VR) | ddee(NR) | def(NR) | fff(VR) | oqq | pqq | ppf(VR) 

dh eine Schnur, ein Suffix in Klammern, dann ein Begrenzungszeichen

I ist versucht, die Syntax in R zu arbeiten, um die Elemente zu löschen, die in (VR) zu beenden, einschließlich des hinteren Rohr falls vorhanden, so dass ich mit links bin:

ddee(NR) | def(NR) | oqq | pqq 

ich kann das nicht funktionieren Re gular expression (oder gsub), die diese Einträge entfernt und möchte anfordern, wenn mir bitte jemand helfen könnte.

Antwort

1

Wenn Sie gsub verwenden möchten, können Sie das Muster in zwei Stufen entfernen:

gsub(" \\| $", "", gsub("\\w+\\(VR\\)(\\|)?", "", s)) 
# firstly remove all words ending with (VR) and optional | following the pattern and 
# then remove the possible | at the end of the string 

# [1] "ddee(NR) | def(NR) | oqq | pqq" 
  • regulären Ausdruck \\w+\\(VR\\) mit (VR) endende Wörter übereinstimmen, werden Klammern von \\ entkam;
  • (\\|)? entspricht optional Delimiter |, dies stellt sicher, dass es das Muster sowohl in der Mitte als auch am Ende der Zeichenfolge entspricht;
  • möglich | weggelassen am Ende der Zeichenfolge kann durch eine zweite gsub entfernt werden;
1

ist hier ein Verfahren strsplit und paste mit dem Zusammenbruch Argument:

paste(sapply(strsplit(temp, split=" +\\| +"), 
     function(i) { i[setdiff(seq_along(i), grep("\\(VR\\)$", i))] }), 
    collapse=" | ") 
[1] "ddee(NR) | def(NR) | oqq | pqq" 

wir auf das Rohr aufgespalten und Zwischenräume, so speisen die resultierende Liste sapply die die grep Funktion verwendet, alle Elemente der Drop Vektor, der mit "(VR)" endet. Schließlich wird das Ergebnis zusammengefügt.

Ich habe eine Teilmengenmethode mit setdiff hinzugefügt, so dass Vektoren ohne "(VR)" ohne jede Änderung zurückgegeben werden.

+0

Ich weiß, dass ich auch Einträge haben, wo es nur einen einzigen Eintrag gibt, d. H. Kein Rohrtrennzeichen. Gibt es eine einfache Möglichkeit, die Methode zu ändern, um "einzelne" Elemente zu berücksichtigen? z.B. "abc" ODER "abc (VR)" – Jon

+0

@Jon Ich habe den Code so geändert, dass er für diese Situation funktioniert. – lmo