2015-05-28 14 views
15

In dplyr, voglio escludere le colonne che contengono la parola "junk" ma, potrebbe non esserci nessuna colonna che contiene la parola "junk". In tal caso, dplyr dovrebbe restituire tutte le colonne. Ma non ne restituisce nessuno. Vedere il test case in basso.in dplyr selezionare con una goccia non funziona

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 

Dove sto andando male?

+0

Si noti che questo funziona bene, se almeno una colonna aveva quella condizione> df <-data.frame (name = pasta ("nome", 1: 5), agejunk = 1: 5) > df1 <-df%>% select (-contains ("junk")) > str (df1) 'data.frame': \t 5 obs. di 1 variabile: $ nome: fattore w/5 livelli "nome 1", "nome 2", ..: 1 2 3 4 5 – guna

+0

Ho pensato qualcosa come 'df%>% select (ifelse (sum (grepl (" junk ", names (df)))> 0, -contains (" junk "), everything()))' funzionerebbe, ma 'tutto()' non sembra restituire tutto ... – tospig

+0

e un storia simile con 'df%>% select (-matches (" * junk * "))' – tospig

risposta

4

Questo funziona, ma non è abbastanza

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

No, non sembra così. – guna

+0

Penso che il problema potrebbe essere che l'OP ha corrispondenze parziali per 'junk' – akrun

+1

Mi ha dato lo stesso problema indicato da OP quando non ci sono colonne spazzatura – akrun

15

Funziona se si mette everything() prima della -contains() all'interno 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 

Tuttavia, sono d'accordo che sarebbe stato più intuitivo se ha funzionato senza la necessità di everything().

+0

Non riesco a trovare "tutto" in 0.4.1. Stai usando la versione di sviluppo? –

+0

@DavidArenburg, è citato in '? Select' nella sezione" funzioni speciali "in 0.4.1 –

+0

Oh questa è una di queste funzioni che può essere chiamata solo all'interno di' select' –

8

Modifica: Questo problema è stato risolto nella versione più recente di dplyr. Vedi anche here.

Messaggio originale: Solo per completezza, ecco il motivo di questo errore. La funzione contains utilizza internamente grep("junk", names(df)). Ovviamente questo restituisce integer(0).

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

Ora -integer(0) è naturalmente lo stesso +integer(0) e chiamando select(df, integer(0)) restituisce chiaramente un frame di dati con 0 colonne.

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