我有一个数据框和该数据框中的列列表,我想放弃。我们以iris
数据集为例。我想删除Sepal.Length
和Sepal.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说使用了“负索引”。那是(我想)我尝试过的,但无济于事。有什么建议吗?
答案 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)
如果列名中包含特殊字符,则select
或select_
可能无法正常工作。
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)