在dplyr中选择一滴不起作用

gun*_*una 18 select r dplyr

在dplyr中,我想排除包含单词"junk"的列,但是,可能没有任何列包含单词"junk".在这种情况下,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
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

tal*_*lat 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
Run Code Online (Sandbox Code Playgroud)

但是,我同意如果它不需要它会更直观everything().


sha*_*dow 8

编辑:这已在最新版本中修复dplyr.另见这里.

原帖:只是为了完整性,这就是这个bug的原因.该功能contains在内部使用grep("junk", names(df)).当然这会回来integer(0).

dplyr:::contains(names(df), "junk")
## integer(0)
Run Code Online (Sandbox Code Playgroud)

现在-integer(0)当然是相同的,+integer(0)并且调用select(df, integer(0))清楚地返回具有0列的数据帧.

select(df, integer(0))
## data frame with 0 columns and 5 rows
Run Code Online (Sandbox Code Playgroud)


pic*_*ick 5

这有效,但它并不漂亮

df %>% select(which(!(names(.) %in% grep("junk", names(.), value=T))))
Run Code Online (Sandbox Code Playgroud)