Muszę filtrować ramkę danych, używając jako kryterium tych wierszy, w których znajduje się ciąg RTB
.
Używam dplyr
.
d.del <- df %.%
group_by(TrackingPixel) %.%
summarise(MonthDelivery = as.integer(sum(Revenue))) %.%
arrange(desc(MonthDelivery))
Wiem, że mogę korzystać z funkcji filter
w dplyr
ale nie dokładnie, jak to powiedzieć, aby sprawdzić treść napisu.
W szczególności chcę sprawdzić zawartość w kolumnie TrackingPixel
. Jeśli ciąg zawiera etykietę RTB
, chcę usunąć wiersz z wyniku.
dplyr
, ale patrząc na pomoc?dplyr::filter
, sugerowałbym coś w stylufilter(df, !grepl("RTB",TrackingPixel))
może?RTB
i nie pokazywanie pozostałych.!
przedgrepl
- spróbuj ponownie.invert
i . Wyrażenia regularne sprawiają, że praca z tekstem jest tysiąc razy łatwiejsza.value
grep
grepl
nie działa na mnie dla postgres, czy to dla MySQL?Odpowiedzi:
Odpowiedź na pytanie została już opublikowana przez @latemail w powyższych komentarzach. Możesz użyć wyrażeń regularnych dla drugiego i kolejnych argumentów
filter
takich jak to:Ponieważ nie podałeś oryginalnych danych, dodam przykład zabawki, używając
mtcars
zestawu danych. Wyobraź sobie, że interesują Cię tylko samochody produkowane przez Mazdę lub Toyotę.Jeśli chcesz to zrobić na odwrót, z wyłączeniem samochodów Toyota i Mazda,
filter
polecenie wygląda następująco:źródło
mtcars$`my type` <- rownames(mtcars)
a następniemtcars %>% filter(grepl('Toyota|Mazda', `my type`))
tbl_sql
asgrepl
, nie przekłada się na sql.Rozwiązanie
Jest możliwość korzystania
str_detect
zstringr
pakietu zawartego wtidyverse
pakiecie.str_detect
zwracaTrue
lubFalse
czy określony wektor zawiera określony ciąg. Możliwe jest filtrowanie przy użyciu tej wartości logicznej. Zobacz Wprowadzenie do stringr, aby uzyskać szczegółowe informacje na tematstringr
pakietu.Dobre rzeczy w Stringr
Powinniśmy raczej użyć
stringr::str_detect()
niżbase::grepl()
. Wynika to z następujących przyczyn.stringr
pakiet rozpoczynają się od przedrostkastr_
, co ułatwia odczytanie kodu.stringr
pakietu jest zawsze data.frame (lub wartość), a następnie parametry. (Dziękujemy Paolo)Reper
Wyniki testu porównawczego są następujące. W przypadku dużych ramek danych
str_detect
jest szybszy.źródło
stringr
pakiet zaczynają się od przedrostka str_, co ułatwia odczyt kodu. W najnowszym nowoczesnym kodzie R zaleca się stosowanie stringr.base R
jest równie dobrastringr
. Jeśli podasz nam pewne „twarde fakty”, takie jak analiza porównawcza, a nie tylko stwierdzenie „jest zalecane” (kto to poleca?), Byłoby to bardzo mile widziane. DziękiTa odpowiedź jest podobna do innych, ale używa preferowanych
stringr::str_detect
i dplyrrownames_to_column
.Utworzono 26.06.2018 przez pakiet reprezentx (v0.2.0).
źródło
str_detect
jest wstringr
pakiecieedycja obejmowała nowszą
across()
składnięOto inne
tidyverse
rozwiązanie, za pomocąfilter(across())
lub wcześniejfilter_at
. Zaletą jest to, że można łatwo rozszerzyć do więcej niż jednej kolumny .Poniżej również rozwiązanie z
filter_all
w celu znalezienia ciągu w dowolnej kolumnie, używającdiamonds
jako przykładu szukania ciągu „V”Ciąg tylko w jednej kolumnie
Zastąpiona teraz składnia tego samego wyglądałaby następująco:
Ciąg we wszystkich kolumnach:
Zastąpiona teraz składnia tego samego wyglądałaby następująco:
Próbowałem znaleźć ogólną alternatywę dla następujących, ale nie od razu znalazłem dobre rozwiązanie:
Aktualizacja: Dzięki użytkownikowi Petrowi Kajzarowi w tej odpowiedzi , tutaj również podejście do powyższego:
źródło