在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()
.
编辑:这已在最新版本中修复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)
这有效,但它并不漂亮
df %>% select(which(!(names(.) %in% grep("junk", names(.), value=T))))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6765 次 |
最近记录: |