用dplyr删除列

det*_*ejr 6 r dplyr

我对简化使用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中为每个列名称查找整数位置。

Psi*_*dom 7

您可以-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)


Moo*_*per 5

使用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)

  • 谢谢你的提示!这是我从未使用过的 purrr 功能。 (2认同)