2015-05-28 9 views
15

W dplyr, chcę, aby wykluczyć kolumny, które zawierają słowo „śmieci” , ale nie mogą być dowolne kolumny, które zawierają słowo „śmieci”. W takim przypadku dplyr powinien zwrócić wszystkie kolumny. Ale nie zwraca żadnego. Zobacz przykładowy test jednostki poniżej.w dplyr wybrać ze spadkiem nie działa

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 

Gdzie się mylę?

+0

Zauważ, że to działa prawidłowo, jeżeli co najmniej jedna kolumna miała ten warunek> df <-data.frame (name = paste ("nazwa", 1: 5), agejunk = 1: 5) > DF1 <-df%>% wybrać (-contains ("śmieci")) > Str (DF1) 'data.frame': \t 5 obs. 1 zmienną: $ name : współczynnik W/5 poziomów "Nazwa 1", "2 Nazwa" ..: 1 2 3 4 5 – guna

+0

Myślałem coś takiego 'df%>% Wybrać (ifelse (suma (Grepl (” śmieci”, nazwy (DF)))> 0, -contains ("śmieci"), wszystko()))' będzie działać, ale 'wszystko()' nie wydaje się, aby wrócić wszystko ... – tospig

+0

oraz podobna historia z 'df%>% select (-matches ("junk * *"))' – tospig

Odpowiedz

4

To działa, ale nie jest to całkiem

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

nie, nie wydaje się tak. – guna

+0

Myślę, że problem może polegać na tym, że OP mają częściowe dopasowania do 'śmieci ' – akrun

+1

Dało mi to ten sam problem, co wskazano przez OP, gdy nie ma kolumn śmieci – akrun

15

To działa, jeśli umieścić everything() przed -contains() wewnątrz 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 

Jednak zgadzam się, że byłoby to bardziej intuicyjne, czy to zadziałało bez potrzeby dodawania everything().

+0

Nie mogę znaleźć "wszystkiego" w 0.4.1. Czy korzystasz z wersji devel? –

+0

@DavidArenburg, jest wymienione w 'select' w sekcji„funkcji specjalnych”w 0.4.1 –

+0

Oh to jest jedna z tych funkcji, które mogą zostać wykorzystane jedynie wewnątrz' select' –

8

Edytuj: Zostało to naprawione w najnowszej wersji dplyr. Zobacz także here.

Oryginalny wpis: Tylko dla kompletności, oto powód tego błędu. Funkcja contains korzysta wewnętrznie z grep("junk", names(df)). Oczywiście to zwraca integer(0).

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

Teraz -integer(0) jest oczywiście taki sam jak +integer(0) i nazywając select(df, integer(0)) wyraźnie zwraca ramkę danych z 0 kolumnach.

select(df, integer(0)) 
## data frame with 0 columns and 5 rows 
Powiązane problemy