2016-08-02 15 views
5

Poszukuję funkcji, która pobiera kolumnę typu ramek, sprawdza, czy zawiera tekst z ciągów znaków i filtruje je po dopasowaniu (w tym częściowym dopasowaniu tekstu) .r - Filtruj wiersze, które zawierają ciąg znaków z wektora

Na przykład, weźmy następujące ramki danych:

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

i następujący wektor

c("cat", "dog") 

chciałbym prowadzony przez kolumnę „zwierzę”, sprawdzając, czy wartość w całości lub częściowo dopasowuje jeden z ciągów w wektorze i odfiltrowuje te, które nie są. Wynikowa ramka danych będzie:

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

Dziękujemy!

Sean

+1

Użyj 'grepl': as' df [grepl ("(cat | pies)", df $ animal),] 'powinno działać. – lmo

Odpowiedz

5

Możemy użyć grep

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

lub używając dplyr

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

To się udało, dziękuję! –

7

Korzystanie dplyr, można spróbować wykonać następujące czynności, zakładając, że tabela jest df:

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

Osobiście uważam, że używanie dplyr i stringr jest łatwiejsze do odczytania kilka miesięcy później podczas przeglądania mojego kodu.

+0

Nie jestem pewien, jak to działa, ponieważ kolumna "zwierzęca" nie jest dokładnie dopasowana. – akrun

+0

Jaka jest struktura rzeczywistej ramki danych? Czy mamy odtwarzalny przykład zawierający dane o zabawkach? – Megatron

+0

Problem polega na tym, że filtruje tylko dokładne dopasowania (kot i pies), a nie dopasowania częściowe (sum i pies preryjny). Powinienem to sprecyzować. Doceniam jednak wygląd. –