在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
我哪里错了?
答案 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))))