0

I have a dataframe with multiple columns containing the string "gear":

mtcars_new <- mtcars %>%
    dplyr::mutate(
        gear_2 = gear*4,
        gear_3 = gear*5)

> head(mtcars_new)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb gear_2
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4     16
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4     16
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1     16
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1     12
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2     12
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1     12
                  gear_3
Mazda RX4             20
Mazda RX4 Wag         20
Datsun 710            20
Hornet 4 Drive        15
Hornet Sportabout     15
Valiant               15

I want to filter this tibble to remove any rows with the value "20" in any of the columns with the string "gear" in the title.

Can anyone suggest how to do this?

eg. something like

mtcars_new %>% dplyr::filter_at(contains("gear"), 20)
mtcars_new %>% dplyr::filter(vars("gear") == 20)

(But something that works..)

icedcoffee
  • 935
  • 1
  • 6
  • 18
  • Try this `mtcars_new[rowSums(mtcars_new == 20) == 0,]` or in `dplyr`, you can do `mtcars_new %>% filter(rowSums(. == 20) == 0)` – Sotos Dec 16 '21 at 13:16
  • https://stackoverflow.com/a/65626523/1999873 Since there's a tag, that this already has an answer, many answers there do not apply, but the one I linked does (almost the same as my answer) – snaut Dec 16 '21 at 13:21
  • 2
    The wasiest answer is `mtcars_new %>% filter(!if_any(contains('gear'), ~ .x==20))` – GuedesBF Dec 16 '21 at 13:32

2 Answers2

1

There are many options, I'd do it like this:

mtcars_new %>% 
  rowwise() %>%
  filter(
    !any(c_across(matches("gear"))==20)
  ) %>% 
  ungroup()

snaut
  • 2,261
  • 18
  • 37
0

Something like the following?

library(dplyr)

mtcars_new <- mtcars %>%
  dplyr::mutate(
    gear_2 = gear*4,
    gear_3 = gear*5)

mtcars_new %>% 
  filter(across(matches("*gear*"), ~ .x != 20))

#>                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb gear_2
#> Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1     12
#> Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2     12
#> Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1     12
#> Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4     12
#> Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3     12
#> Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3     12
#> Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3     12
#> Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4     12
#> Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4     12
#> Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4     12
#> Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1     12
#> Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2     12
#> AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2     12
#> Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4     12
#> Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2     12
#>                     gear_3
#> Hornet 4 Drive          15
#> Hornet Sportabout       15
#> Valiant                 15
#> Duster 360              15
#> Merc 450SE              15
#> Merc 450SL              15
#> Merc 450SLC             15
#> Cadillac Fleetwood      15
#> Lincoln Continental     15
#> Chrysler Imperial       15
#> Toyota Corona           15
#> Dodge Challenger        15
#> AMC Javelin             15
#> Camaro Z28              15
#> Pontiac Firebird        15
PaulS
  • 21,159
  • 2
  • 9
  • 26