R dplyr:删除多个列

时间:2016-03-07 08:42:50

标签: r dplyr

我有一个数据框和该数据框中的列列表,我想放弃。我们以iris数据集为例。我想删除Sepal.LengthSepal.Width并仅使用其余列。如何使用select包中的select_dplyr执行此操作?

这是我到目前为止所尝试的内容:

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

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

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

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

iris %>% select(!drop.cols)
  

!drop.cols出错:参数类型无效

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

!drop.cols出错:参数类型无效

我觉得我错过了一些明显的东西,因为这些似乎是一个非常有用的操作,应该已经存在。在Github上,有人发布了a similar issue,Hadley说使用了“负索引”。那是(我想)我尝试过的,但无济于事。有什么建议吗?

10 个答案:

答案 0 :(得分:98)

检查select_vars上的帮助。这为您提供了一些关于如何使用它的额外想法。

在你的情况下:

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

答案 1 :(得分:47)

也试试

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

答案 2 :(得分:19)

超越select(-one_of(drop.cols))还有一些其他选项可以使用select()删除不涉及定义所有特定列名的列(使用dplyr starwars示例数据以获得更多种类的列名):

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 

答案 3 :(得分:5)

我们可以尝试

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

答案 4 :(得分:5)

请注意select()函数,因为它在dplyr和MASS包中都使用过,因此如果加载了MASS,则select()可能无法正常工作。要找出加载的包,请键入sessionInfo()并在“其他附加包:”部分中查找它。如果已加载,请键入detach( "package:MASS", unload = TRUE ),您的select()功能应该再次有效。

答案 5 :(得分:2)

对于到达这里想要删除范围的列的任何人。

最小可重现示例

像这样删除范围的列:

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

注意:

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

答案 6 :(得分:1)

如果列名中包含特殊字符,则selectselect_可能无法正常工作。 dplyr使用"."的此属性。要引用问题中的数据集,可以使用以下行来解决此问题:

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

答案 7 :(得分:1)

另一种方法是将不需要的列更改为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

答案 8 :(得分:1)

我也遇到了同样的问题,但主要错误在于包含具有与“select()”同名的另一个函数定义的库。对我来说,它与 MASS 包选择功能发生冲突。

分离 MASS 库后,错误停止。

答案 9 :(得分:0)

您可以尝试

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