2016-08-02 10 views
5

Ich bin auf der Suche nach einer Funktion, die eine Dataframe Spalte, prüft, ob es Text aus einem Vektor von Zeichenfolgen enthält, und filtert es nach Übereinstimmung (einschließlich einer partiellen Textübereinstimmung) .r - Filter Zeilen, die eine Zeichenfolge aus einem Vektor enthalten

Nehmen wir zum Beispiel die folgende Datenrahmen:

animal  |count 
aardvark |8 
cat  |2 
catfish |6 
dog  |12 
dolphin |3 
penguin |38 
prairie dog|59 
zebra  |17 

und den folgenden Vektor

c("cat", "dog") 

Ich mag würde durch das ‚Tier‘ Spalte laufen, zu überprüfen, ob der Wert ganz oder Teilt Übereinstimmungen mit einer der Zeichenfolgen im Vektor und filtert diejenigen heraus, die nicht vorhanden sind. Der resultierende Datenrahmen wäre:

animal  |count 
cat  |2 
catfish |6 
dog  |12 
prairie dog|59 

Vielen Dank!

Sean

+1

Verwenden Sie 'grepl': als' df [grepl ("(Katze | Hund)", df $ Tier),] sollte funktionieren. – lmo

Antwort

5

Wir verwenden grep

df1[grep(paste(v1, collapse="|"), df1$animal),] 

Oder dplyr

df1 %>% 
    filter(grepl(paste(v1, collapse="|"), animal)) 
+1

Das ist es, danke! –

7

Mit dplyr verwenden, können Sie versuchen, die folgenden, vorausgesetzt, Ihr Tisch ist df:

library(dplyr) 
library(stringr) 
animalList <- c("cat", "dog") 
filter(df, str_detect(animal, paste(animalList, collapse="|"))) 

Ich persönlich finde die Verwendung von dplyr und stringr Monate später bei der Überprüfung meines Codes einfacher zu lesen.

+0

Ich bin nicht sicher, wie das funktioniert, da die Spalte "Tier" keine exakte Übereinstimmung hat. – akrun

+0

Wie ist der eigentliche Datenrahmen aufgebaut? Haben wir ein reproduzierbares Beispiel mit Spielzeugdaten? – Megatron

+0

Das Problem damit ist, dass es nur genaue Übereinstimmungen (Katze und Hund) und nicht teilweise Übereinstimmungen (Wels und Präriehund) filtert. Ich hätte das spezifizieren sollen. Ich schätze das Aussehen aber. –

Verwandte Themen