我有兴趣简化使用 dplyr(版本 >= 0.7)删除列的方式。假设我有一个名称字符向量。
drop <- c("disp", "drat", "gear", "am")
选择列
与 current version dplyr 版本,您可以使用以下命令执行选择:
dplyr::select(mtcars, !! rlang::quo(drop))
或者使用基本 R 更容易:
mtcars[, drop]
删除列
删除列名是另一回事。我们可以使用每个不带引号的列名称来删除它们:
dplyr::select(mtcars, -disp, -drat, -gear, -am)
但是,如果您有一个包含数百列的 data.frame,这不是一个很好的解决方案。我知道的最好的解决方案是使用:
dplyr::select(mtcars, -which(names(mtcars) %in% drop))
这相当简单,并且适用于 dplyr 和基本 R。但是,我想知道是否有一种方法不涉及在 data.frame 中查找每个列名称的整数位置。
最佳答案
使用modify_at
并将列设置为NULL
,这将删除它们:
mtcars %>% modify_at(drop,~NULL)
# mpg cyl hp wt qsec vs carb
# Mazda RX4 21.0 6 110 2.620 16.46 0 4
# Mazda RX4 Wag 21.0 6 110 2.875 17.02 0 4
# Datsun 710 22.8 4 93 2.320 18.61 1 1
# Hornet 4 Drive 21.4 6 110 3.215 19.44 1 1
# Hornet Sportabout 18.7 8 175 3.440 17.02 0 2
# Valiant 18.1 6 105 3.460 20.22 1 1
# ...
更接近您所尝试的,您可以尝试 magrittr::extract
而不是 dplyr::select
extract(mtcars,!names(mtcars) %in% drop) # same output
关于使用 dplyr 删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614385/