chỉnh sửa bao gồm across()
cú pháp mới hơn
Đây là một tidyverse
giải pháp khác , sử dụng filter(across())
hoặc trước đây filter_at
. Ưu điểm là bạn có thể dễ dàng mở rộng đến nhiều hơn một cột .
Dưới đây cũng là một giải pháp filter_all
để tìm chuỗi trong bất kỳ cột nào , sử dụng diamonds
làm ví dụ, tìm kiếm chuỗi "V"
library(tidyverse)
Chuỗi chỉ trong một cột
# 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
Cú pháp thay thế bây giờ cho cùng một sẽ là:
mtcars %>%
rownames_to_column("type") %>%
filter_at(.vars= vars(type), all_vars(!grepl('Toyota|Mazda',.)))
Chuỗi trong tất cả các cột:
# 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
Cú pháp thay thế bây giờ cho cùng một sẽ là:
diamonds %>%
filter_all(all_vars(!grepl('V', .))) %>%
head
Tôi đã cố gắng tìm một giải pháp thay thế cho những điều sau đây, nhưng tôi đã không ngay lập tức đưa ra một giải pháp tốt:
#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
Cập nhật: Cảm ơn người dùng Petr Kajzar trong câu trả lời này , đây cũng là một cách tiếp cận cho vấn đề trên:
diamonds %>%
filter(rowSums(across(everything(), ~grepl("V", .x))) > 0)
dplyr
, nhưng nhìn vào sự giúp đỡ trong?dplyr::filter
tôi muốn đề xuất một cái gì đó nhưfilter(df, !grepl("RTB",TrackingPixel))
có thể?