将 dplyr::select 的 where 与基础 R grepl 和匿名函数一起使用

Use dplyr::select's where with base R grepl and anonymus function

这里有一个非常相似的问题:How to select columns based on grep in dplyr::tibble

不过我认为 select_if 已被 select(where()) 取代。

我知道我可以执行以下操作并且有效:

# select all columns with three characters
mtcars %>% 
  select(
    matches("^[a-zA-Z]{3}$")
  )

但我也可以对 select 列使用匿名函数(此处针对所有列值而不是名称)。

mtcars %>% 
  select(
    where(function(x)sum(is.na(x)) == 0)
  )

所以我想我可以使用匿名函数和 grepl 到 select 列。这不起作用:

mtcars %>% 
  select(
    where(
      function(x) grepl("^[a-zA-Z]{3}$", x)
    )
  )

我怎样才能完成这项工作?我的意思是我总是可以使用 matches 助手。但我只想了解如何使用

select(where()) 声明数据框的名称,而不是列中的所有值。

更新

这个有效:

mtcars %>% 
  select(
      which(grepl("^[a-zA-Z]{3}$", names(.)))
  )

但是不知道有没有更好的方法;)

Base R选项:

mtcars[grepl("^[a-zA-Z]{3}$", names(mtcars))]

输出:

                     mpg cyl
Mazda RX4           21.0   6
Mazda RX4 Wag       21.0   6
Datsun 710          22.8   4
Hornet 4 Drive      21.4   6
Hornet Sportabout   18.7   8
Valiant             18.1   6
Duster 360          14.3   8
Merc 240D           24.4   4
Merc 230            22.8   4
Merc 280            19.2   6
Merc 280C           17.8   6
Merc 450SE          16.4   8
Merc 450SL          17.3   8
Merc 450SLC         15.2   8
Cadillac Fleetwood  10.4   8
Lincoln Continental 10.4   8
Chrysler Imperial   14.7   8
Fiat 128            32.4   4
Honda Civic         30.4   4
Toyota Corolla      33.9   4
Toyota Corona       21.5   4
Dodge Challenger    15.5   8
AMC Javelin         15.2   8
Camaro Z28          13.3   8
Pontiac Firebird    19.2   8
Fiat X1-9           27.3   4
Porsche 914-2       26.0   4
Lotus Europa        30.4   4
Ford Pantera L      15.8   8
Ferrari Dino        19.7   6
Maserati Bora       15.0   8
Volvo 142E          21.4   4

您可以只使用 grep()select(),而不使用 where() 函数。

mtcars %>% 
  select(grep("^[a-zA-Z]{3}$", names(.)))

您最初的尝试没有成功,因为在这段代码中:

mtcars %>% 
  select(
    where(
      function(x) grepl("^[a-zA-Z]{3}$", x)
    )
  )

where()函数中的x是变量的值而不是变量的名称。这就是为什么如果你做了类似 where(is.numeric) 的事情它会起作用的原因 - 因为它正在替换实际值。