【问题标题】:Filter a tibble using dplyr based on if column contains a certain string [duplicate]根据列是否包含某个字符串,使用 dplyr 过滤 tibble [重复]
【发布时间】:2022-01-19 13:54:20
【问题描述】:

我有一个包含字符串“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

我想过滤此 tibble 以删除标题中带有字符串“gear”的任何列中任何值为“20”的行。

谁能建议如何做到这一点?

例如。像

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

(但有些东西可行..)

【问题讨论】:

  • 试试这个mtcars_new[rowSums(mtcars_new == 20) == 0,]dplyr,你可以做mtcars_new %&gt;% filter(rowSums(. == 20) == 0)
  • stackoverflow.com/a/65626523/1999873 因为有一个标签,这已经有一个答案,那里的许多答案都不适用,但我链接的那个(几乎和我的答案一样)
  • 最垃圾的答案是mtcars_new %&gt;% filter(!if_any(contains('gear'), ~ .x==20))

标签: r dplyr


【解决方案1】:

类似以下内容?

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

【讨论】:

    【解决方案2】:

    有很多选择,我会这样做:

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

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 2018-10-15
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多