edycja obejmowała nowszą across()
składnię
Oto inne tidyverse
rozwiązanie, za pomocą filter(across())
lub wcześniej filter_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ąc diamonds
jako przykładu szukania ciągu „V”
library(tidyverse)
Ciąg tylko w jednej kolumnie
# for only one column... extendable to more than one creating a column list in `across` or `vars`!
mtcars %>%
rownames_to_column("type") %>%
filter(across(type, ~ !grepl('Toyota|Mazda', .))) %>%
head()
#> type mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#> 2 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#> 3 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#> 4 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
#> 5 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
#> 6 Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Zastąpiona teraz składnia tego samego wyglądałaby następująco:
mtcars %>%
rownames_to_column("type") %>%
filter_at(.vars= vars(type), all_vars(!grepl('Toyota|Mazda',.)))
Ciąg we wszystkich kolumnach:
# remove all rows where any column contains 'V'
diamonds %>%
filter(across(everything(), ~ !grepl('V', .))) %>%
head
#> # A tibble: 6 x 10
#> carat cut color clarity depth table price x y z
#> <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
#> 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
#> 3 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
#> 4 0.3 Good J SI1 64 55 339 4.25 4.28 2.73
#> 5 0.22 Premium F SI1 60.4 61 342 3.88 3.84 2.33
#> 6 0.31 Ideal J SI2 62.2 54 344 4.35 4.37 2.71
Zastąpiona teraz składnia tego samego wyglądałaby następująco:
diamonds %>%
filter_all(all_vars(!grepl('V', .))) %>%
head
Próbowałem znaleźć ogólną alternatywę dla następujących, ale nie od razu znalazłem dobre rozwiązanie:
#get all rows where any column contains 'V'
diamonds %>%
filter_all(any_vars(grepl('V',.))) %>%
head
#> # A tibble: 6 x 10
#> carat cut color clarity depth table price x y z
#> <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#> 1 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
#> 2 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63
#> 3 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
#> 4 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47
#> 5 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53
#> 6 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49
Aktualizacja: Dzięki użytkownikowi Petrowi Kajzarowi w tej odpowiedzi , tutaj również podejście do powyższego:
diamonds %>%
filter(rowSums(across(everything(), ~grepl("V", .x))) > 0)
dplyr
, ale patrząc na pomoc?dplyr::filter
, sugerowałbym coś w stylufilter(df, !grepl("RTB",TrackingPixel))
może?