我对简化使用dplyr(版本> = 0.7)删除列的方式感兴趣。假设我有一个名字的字符向量。
drop <- c("disp", "drat", "gear", "am")
Run Code Online (Sandbox Code Playgroud)
使用dplyr 的当前版本,您可以执行以下选择:
dplyr::select(mtcars, !! rlang::quo(drop))
Run Code Online (Sandbox Code Playgroud)
甚至使用基数R更容易:
mtcars[, drop]
Run Code Online (Sandbox Code Playgroud)
删除列名是另一回事。我们可以使用每个未加引号的列名将其删除:
dplyr::select(mtcars, -disp, -drat, -gear, -am)
Run Code Online (Sandbox Code Playgroud)
但是,如果您有一个包含数百列的data.frame,那么这不是一个很好的解决方案。我所知道的最佳解决方案是使用:
dplyr::select(mtcars, -which(names(mtcars) %in% drop))
Run Code Online (Sandbox Code Playgroud)
这非常简单,并且适用于dplyr和baseR。但是,我想知道是否有一种方法不涉及在data.frame中为每个列名称查找整数位置。
您可以-one_of(drop)使用select:
drop <- c("disp", "drat", "gear", "am")
select(mtcars, -one_of(drop)) %>% names()
# [1] "mpg" "cyl" "hp" "wt" "qsec" "vs" "carb"
Run Code Online (Sandbox Code Playgroud)
one_of将字符向量中的列名称计算为整数,类似于which(... %in% ...):
one_of(drop, vars = names(mtcars))
# [1] 3 5 10 9
which(names(mtcars) %in% drop)
# [1] 3 5 9 10
Run Code Online (Sandbox Code Playgroud)
使用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
# ...
Run Code Online (Sandbox Code Playgroud)
更接近您的尝试,您可以尝试magrittr::extract代替dplyr::select
extract(mtcars,!names(mtcars) %in% drop) # same output
Run Code Online (Sandbox Code Playgroud)