在dplyr中选择一滴不起作用

时间:2015-05-28 03:52:43

标签: r select dplyr

在dplyr中,我想排除包含“垃圾”一词的列 但是,可能没有任何列包含“垃圾”一词。在这种情况下,dplyr应该返回所有列。但它没有返回。 请参阅下面的单元测试用例。

df<-data.frame(name=paste("name",1:5), age=1:5)
str(df)
# 'data.frame': 5 obs. of  2 variables:
# $ name: Factor w/ 5 levels "name 1","name 2",..: 1 2 3 4 5
# $ age : int  1 2 3 4 5
df1<-df%>%select(-contains("junk"))
str(df1)
# 'data.frame': 5 obs. of  0 variables

我哪里错了?

3 个答案:

答案 0 :(得分:19)

如果您将everything()放在-contains()select之内,那么它会有效:

library(dplyr) # 0.4.1
df %>% select(everything(), -contains("junk"))
#    name age
#1 name 1   1
#2 name 2   2
#3 name 3   3
#4 name 4   4
#5 name 5   5

但是,我同意如果它不需要everything()就可以更直观。

答案 1 :(得分:8)

修改:已在dplyr的最新版本中修复此问题。另请参阅here

原帖:为了完整起见,以下是此错误的原因。函数contains在内部使用grep("junk", names(df))。当然这会返回integer(0)

dplyr:::contains(names(df), "junk")
## integer(0)

现在-integer(0)当然与+integer(0)相同,并且调用select(df, integer(0))会清楚地返回一个包含0列的数据框。

select(df, integer(0))
## data frame with 0 columns and 5 rows

答案 2 :(得分:5)

这很有效,但它并不漂亮

df %>% select(which(!(names(.) %in% grep("junk", names(.), value=T))))