2014-12-04 10 views
8

Ho un grande dataframe che vorrei utilizzare l'eccellente pacchetto dplyr (Wickham) che ho scoperto di recente. Vorrei filtrare le colonne che contengono caratteri. È possibile?Usa dplyr per filtrare colonne contenenti caratteri

Ad esempio, nei set di dati flights all'interno del pacchetto nycflights13, come è possibile filtrare le colonne che hanno classe 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 ... 

Qualche idea?

+1

Questo è un po' saccente ma solo per le tue informazioni, in dplyr, usi 'select' per scegliere le colonne e' filter' per scegliere le righe - quindi non puoi tecnicamente "filtrare per le colonne". –

+0

La mia risposta qui è "perché?". Cosa vuoi fare con questo (o qualche altro) set di dati che richiede la rimozione di tutte le colonne di caratteri? Potrebbe esserci un modo migliore ... – Spacedman

+0

Esiste. È nella mia risposta, usando 'Filtro' –

risposta

5

Io non credo che ci sia una scorciatoia dplyr per questo, ma si può ottenere quello che cerchi grazie:

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

Una variazione di questo sarebbe ' voli%>% select (-quando (sapply (voli, is.character))) ' –

+1

' -che 'è una cattiva idea. Provalo su un data.frame senza colonne di caratteri. – Arun

8

Si potrebbe provare summarise_each da dplyr

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

Immagino che 'sumarise_each' sia più facile di' colwise'. Non ho capito che fa il trucco. –

+0

@RichardScriven Ho fatto il test con 'voli'. Sembra funzionare bene. – akrun

+2

Sei pronto per questo? "Seleziona (voli, summarise_each (voli, funs (is.character (.)))%>% Unlist()%>% which())' Haha. 'dplyr' è piuttosto divertente –

5

I don' Ho i dati dei voli, ma questo metodo funziona anche su altri dati che ho sperimentato su

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

Naturalmente, c'è sempre basare R. Per questo compito mi sembra un po 'più facile

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

@beginneR - grazie, l'ho rimosso. Apparentemente qualcun altro non era d'accordo né –

+0

Hm, che non ero io .. –

+0

@beginneR - Mi rendo conto ora che ho usato 'colwise' in modo errato. Sarebbe stato meglio, e più facile, sostituire il vettore logico in 'select' con i suoi nomi e tutto, dove stavo facendo' .dots = names (vec) [vec] ' –

5

Non è necessario dplyr per questo, è possibile utilizzare di base R:

flights[, !sapply(flights, is.character)] 
Problemi correlati