将 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)
的事情它会起作用的原因 - 因为它正在替换实际值。
这里有一个非常相似的问题: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)
的事情它会起作用的原因 - 因为它正在替换实际值。