R dplyr: 删除多列

我有一个数据框,并在该数据框中列列表,我想删除。让我们以 iris数据集为例。我想删除 Sepal.LengthSepal.Width,只使用剩余的列。我如何做到这一点使用 selectselect_dplyr包?

以下是我目前为止的尝试:

drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)

错误 in-drop.Protocol: 一元运算符的无效参数

iris %>% select_(.dots = -drop.cols)

错误 in-drop.Protocol: 一元运算符的无效参数

iris %>% select(!drop.cols)

Error in !drop.cols : invalid argument type

iris %>% select_(.dots = !drop.cols)

错误在! drop.尊: 无效的参数类型

我觉得我忽略了一些显而易见的东西因为这些看起来是一个非常有用的操作,应该已经存在了。在 Github 上,有人发布了 类似的问题,哈德利说要使用“负索引”。这就是(我想)我试过的办法,但没有用。有什么建议吗?

168141 次浏览

Check the help on select_vars. That gives you some extra ideas on how to work with this.

In your case:

iris %>% select(-one_of(drop.cols))

We can try

iris %>%
select_(.dots= setdiff(names(.),drop.cols))

also try

## Notice the lack of quotes
iris %>% select (-c(Sepal.Length, Sepal.Width))

小心使用 select()函数,因为它同时用于 dplyr 和 MASS 包,所以如果 MASS 被加载,select ()可能无法正常工作。要了解加载了什么包,输入 sessionInfo()并在“其他附加包:”部分中查找它。如果已加载,键入 detach( "package:MASS", unload = TRUE ),那么 select()函数应该会再次工作。

除了 select(-one_of(drop.cols))之外,还有一些使用 select()删除列的其他选项,这些选项不涉及定义所有特定的列名(使用 dplyr starwar 示例数据获得更多不同的列名) :

starwars %>%
select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
select(-contains('color')) %>%  # any column name that contains 'color'
select(-starts_with('bi')) %>%  # any column name that starts with 'bi'
select(-ends_with('er')) %>%    # any column name that ends with 'er'
select(-matches('^f.+s$')) %>%  # any column name matching the regex pattern
select_if(~!is.list(.)) %>%     # not by column name but by data type
head(2)


# A tibble: 2 x 2
homeworld species
<chr>     <chr>
1 Tatooine  Human
2 Tatooine  Droid

如果列名中有特殊字符,则 selectselect_可能无法按预期工作。 使用 "."dplyr的这个特性。参考问题中的数据集,可以使用以下一行来解决这个问题:

drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% .[,setdiff(names(.),drop.cols)]

另一种方法是将不需要的列转换为 NULL,这样可以避免嵌入括号:

head(iris,2) %>% mutate_at(drop.cols, ~NULL)
#   Petal.Length Petal.Width Species
# 1          1.4         0.2  setosa
# 2          1.4         0.2  setosa

You can try

iris %>% select(-!!drop.cols)

I also faced the same issue, but the main error was in including library which has another function definition with the same name as "select()". For me it was clashing with the MASS package select function.

分离 MASS 库后,错误停止。

对于任何到这里想要降低 range的柱子。

可重复性最小的例子

像下面这样放置一个 射程列:

iris %>%
select(-(Sepal.Width:Petal.Width)) %>%
head


#   Sepal.Length Species
# 1          5.1  setosa
# 2          4.9  setosa
# 3          4.7  setosa
# 4          4.6  setosa
# 5          5.0  setosa
# 6          5.4  setosa

注:

  • 列名周围的 ()非常重要,必须使用