Ich versuche zu grep
testen, ob ein Vektor von Zeichenfolgen in einem anderen Vektor vorhanden ist oder nicht, und die vorhandenen Werte (die übereinstimmenden Muster) auszugeben.
Ich habe einen Datenrahmen wie diesen:
FirstName Letter
Alex A1
Alex A6
Alex A7
Bob A1
Chris A9
Chris A6
Ich habe einen Vektor von Zeichenfolgenmustern in den Spalten "Buchstabe", zum Beispiel : c("A1", "A9", "A6")
.
Ich möchte überprüfen, ob eine der Zeichenfolgen im Mustervektor in der Spalte "Buchstabe" vorhanden ist. Wenn ja, möchte ich die Ausgabe eindeutiger Werte.
Das Problem ist, ich weiß nicht, wie ich grep
mit mehreren Mustern arbeiten soll. Ich habe es versucht:
matches <- unique (
grep("A1| A9 | A6", myfile$Letter, value=TRUE, fixed=TRUE)
)
Aber es gibt mir 0 Übereinstimmungen, was nicht stimmt, irgendwelche Vorschläge?
fixed=TRUE
Ihr Muster ein echter regulärer Ausdruck ist.match
oder%in%
oder sogar==
ist der einzig richtige Weg, um genaue Übereinstimmungen zu vergleichen. Regex ist für eine solche Aufgabe sehr gefährlich und kann zu unerwarteten Ergebnissen führen.Antworten:
Zusätzlich zu @ Mareks Kommentar zum Nichteinschließen
fixed==TRUE
müssen Sie auch keine Leerzeichen in Ihrem regulären Ausdruck haben. Es sollte sein"A1|A9|A6"
.Sie erwähnen auch, dass es viele Muster gibt. Angenommen, sie befinden sich in einem Vektor
Dann können Sie Ihren regulären Ausdruck direkt mit
paste
und erstellencollapse = "|"
.quelle
toMatch %in% myfile$Letter
?Gute Antworten, aber vergessen Sie nicht
filter()
von dplyr:quelle
grepl
funktioniert mit jeweils einem Muster (wir brauchen einen Vektor mit der Länge 1), wir haben 3 Muster (Vektor mit der Länge 3), also können wir sie mit einem kombinieren, indem wir ein für Grepl geeignetes Trennzeichen verwenden -|
versuchen Sie Ihr Glück mit anderen :))|(
zum Trennen von Mustern könnte dies robuster machen :paste0("(", paste(patterns, collapse=")|("),")")
. Leider wird es auch etwas weniger elegant. Dies führt zu einem Muster(A1)|(A9)|(A6)
.Das sollte funktionieren:
Oder noch einfacher:
quelle
%like%
befindet sich nicht in Basis R, daher sollten Sie angeben, welche Pakete für die Verwendung erforderlich sind.%like%
ist sie Teil desdata.table
Pakets. Auch ähnlichdata.table
sindlike(...)
,%ilike%
und%flike%
.Basierend auf Brian Diggs Beitrag gibt es hier zwei hilfreiche Funktionen zum Filtern von Listen:
quelle
Haben Sie die
match()
odercharmatch()
Funktionen ausprobiert ?Anwendungsbeispiel:
quelle
match
ist, ist, dass es keine Muster verwendet, sondern eine genaue Übereinstimmung erwartet.Nicht sicher, ob diese Antwort bereits erschienen ist ...
Für das jeweilige Muster in der Frage können Sie dies einfach mit einem einzigen
grep()
Aufruf tun.quelle
Zur Antwort von Brian Diggs hinzufügen.
Bei einer anderen Verwendung von grepl wird ein Datenrahmen zurückgegeben, der alle Ihre Werte enthält.
Vielleicht ein bisschen sauberer ... vielleicht?
quelle
Nehmen Sie die Räume weg. Dann mach's:
quelle
Verwendung der
sapply
quelle
Ich schlage vor, ein kleines Skript zu schreiben und mehrere Suchvorgänge mit Grep durchzuführen. Ich habe nie einen Weg gefunden, nach mehreren Mustern zu suchen, und glauben Sie mir, ich habe gesucht!
So wie Ihre Shell-Datei mit einer eingebetteten Zeichenfolge:
Führen Sie dann myshell.sh aus.
Wenn Sie in der Lage sein möchten, die Zeichenfolge in der Befehlszeile zu übergeben, gehen Sie folgendermaßen mit einem Shell-Argument vor - dies ist übrigens die Bash-Notation:
Und so weiter.
Wenn viele Muster übereinstimmen, können Sie sie in eine for-Schleife einfügen.
quelle