2015-05-28 20 views
15

dplyr, "önemsiz" sözcüğünü içeren sütunları hariç tutmak istiyorum, ancak "önemsiz" sözcüğü içeren herhangi bir sütun olmayabilir. Bu durumda, dplyr tüm sütunları döndürmelidir. Ama hiçbiri döndürmez. Aşağıdaki birim test örneğine bakın.dplyr bir damla ile seçin çalışmıyor

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 

Neredesin?

+0

Not (: 5), agejunk = 1: ad = macun ("name", 1 5) > df1 <-df%>% 'i seçin (-akanlar ("önemsiz")) > str (df1) ' data.frame ': \t 5 obs. 1 değişkeni: $ isim: Faktör w/5 seviyeleri "isim 1", "ad 2", ..: 1 2 3 4 5 – guna

+0

Df%>% select (ifelse (sum (grepl (") gibi bir şey düşündüm önemsiz ", adlar (df)))> 0, -olar (" önemsiz "), herşey())' çalışırdı, ama 'herşey()' herşeyi geri döndürmez ... – tospig

+0

ve df%>% select (-matches ("* junk *")) ' – tospig

cevap

4

Bu çalışır, ancak

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

Hayır ile benzer bir hikaye Hayır, öyle görünmüyor. – guna

+0

Problemin OP'nin "junk" – akrun

+1

için kısmi eşleşmeleri olabileceğini düşünüyorum. – akrun

15

-contains()select içine daha önce everything() koyarsanız O inşaat hoş değil: Ancak

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 

, ben çalışsam daha sezgisel olacağını kabul everything()'a gerek kalmadan.

+0

"Her şeyi" 0.4.1'de bulamıyorum. Devel sürümünü kullanıyor musunuz? –

+0

@DavidArenburg, 0.4.1 –

+0

'da "özel işlevler" bölümünde "select" altında belirtilmiştir. Bu, yalnızca 'select' –

8

Düzeltme: Bu, dplyr'un en yeni sürümünde düzeltilmiştir. Ayrıca bkz. here.

Orijinal mesaj: Sadece tamlık için, işte bu hatanın nedeni budur. contains işlevi, dahili olarak grep("junk", names(df)) kullanıyor. Tabii ki bu integer(0) döndürür.

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

Şimdi -integer(0)+integer(0) aynı tabii olup select(df, integer(0)) çağırarak açıkça 0 sütunlu bir veri çerçevesini döndürür. en az bir sütun bu şartı> df <-data.frame olsaydı bu ince çalıştığını

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