2014-12-04 8 views
8

Mam dużą ramkę danych, którą chciałbym wykorzystać jako doskonały pakiet dplyr (Wickham), który właśnie odkryłem. Chciałbym odfiltrować kolumny zawierające znaki. czy to możliwe?Użyj dplyr, aby odfiltrować kolumny zawierające znaki

Na przykład w zestawach danych flights w pakiecie nycflights13, w jaki sposób mogę odfiltrować kolumny z klasą character?

library(nycflights13) 
data(flights) 
str(flights) 
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 336776 obs. of 16 variables: 
$ year  : int 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ... 
$ month : int 1 1 1 1 1 1 1 1 1 1 ... 
$ day  : int 1 1 1 1 1 1 1 1 1 1 ... 
$ dep_time : int 517 533 542 544 554 554 555 557 557 558 ... 
$ dep_delay: num 2 4 2 -1 -6 -4 -5 -3 -3 -2 ... 
$ arr_time : int 830 850 923 1004 812 740 913 709 838 753 ... 
$ arr_delay: num 11 20 33 -18 -25 12 19 -14 -8 8 ... 
$ carrier : chr "UA" "UA" "AA" "B6" ... 
$ tailnum : chr "N14228" "N24211" "N619AA" "N804JB" ... 
$ flight : int 1545 1714 1141 725 461 1696 507 5708 79 301 ... 
$ origin : chr "EWR" "LGA" "JFK" "JFK" ... 
$ dest  : chr "IAH" "IAH" "MIA" "BQN" ... 
$ air_time : num 227 227 160 183 116 150 158 53 140 138 ... 
$ distance : num 1400 1416 1089 1576 762 ... 
$ hour  : num 5 5 5 5 5 5 5 5 5 5 ... 
$ minute : num 17 33 42 44 54 54 55 57 57 58 ... 

Wszelkie pomysły?

+1

To jest trochę pedantyczny ale tylko dla twoich informacji, w dplyr, używasz 'select' do wybierania kolumn i' filter' do wybierania wierszy - więc nie możesz technicznie "filtrować kolumn". –

+0

Moja odpowiedź tutaj brzmi "dlaczego?". Co chcesz zrobić z tym (lub innym) zestawem danych, który wymaga usunięcia wszystkich kolumn znaków? Może być lepszy sposób ... – Spacedman

+0

Jest. W mojej odpowiedzi, używając 'Filtra' –

Odpowiedz

5

nie sądzę istnieje dplyr skrót do tego, ale można dostać to, co jesteś po z:

flights %>% select(which(sapply(flights, class) != 'character')) 

# Source: local data frame [336,776 x 12] 
# 
# year month day dep_time dep_delay arr_time arr_delay flight air_time distance hour minute 
# 1 2013  1 1  517   2  830  11 1545  227  1400 5  17 
# 2 2013  1 1  533   4  850  20 1714  227  1416 5  33 
# 3 2013  1 1  542   2  923  33 1141  160  1089 5  42 
# 4 2013  1 1  544  -1  1004  -18 725  183  1576 5  44 
# 5 2013  1 1  554  -6  812  -25 461  116  762 5  54 
# 6 2013  1 1  554  -4  740  12 1696  150  719 5  54 
# 7 2013  1 1  555  -5  913  19 507  158  1065 5  55 
# 8 2013  1 1  557  -3  709  -14 5708  53  229 5  57 
# 9 2013  1 1  557  -3  838  -8  79  140  944 5  57 
# 10 2013  1 1  558  -2  753   8 301  138  733 5  58 
# .. ... ... ...  ...  ...  ...  ... ...  ...  ... ... ... 
+1

Wariacją tego byłoby " loty%>% select (-which (sapply (flights, is.character))) ' –

+1

' 'który jest złym pomysłem. Wypróbuj go na data.frame bez kolumn znaków. – Arun

8

Można spróbować summarise_each z dplyr

library(dplyr) 
indx <- which(unlist(summarise_each(flights, funs(class))!='character')) 
flights %>% 
     select(indx) 
+0

Domyślam się, że 'summarise_each' jest łatwiejsze niż' colwise'. Nie zdawałem sobie sprawy, że to wystarczy. –

+0

@RichardScriven Testowałem z 'lotami'. Wydaje się działać dobrze. – akrun

+2

Czy jesteś gotowy na to .. 'select (loty, summary_each (loty, zabawy (jest.character (.)))%>% Unlist()%>% which())' Haha. 'dplyr' jest całkiem zabawny –

5

I don” t mają dane o lotach, ale ta metoda działa również w przypadku niektórych innych danych eksperymentowanych pod adresem

do(flights, Filter(Negate(is.character), .)) 

Oczywiście, zawsze oprzeć R. Do tego zadania wydaje się nieco łatwiejsze

Filter(Negate(is.character), flights) 
+0

@beginneR - dzięki, usunąłem to. Najwyraźniej ktoś inny nie zgodził się ani –

+0

Hm, to nie byłem ja .. –

+0

@beginneR - Zdaję sobie teraz sprawę, że niewłaściwie użyłem słowa "colwise". Byłoby lepiej i łatwiej zamieniać wektor logiczny na 'select' z jego nazwami i wszystkim, gdzie robiłem' .dots = names (vec) [vec] ' –

5

Nie trzeba dplyr na to, można użyć zasady R:

flights[, !sapply(flights, is.character)] 
Powiązane problemy