2015-08-16 9 views
14

Quando interagisco con i dati, trovo che la funzione select() della libreria dplyr è un ottimo modo per organizzare le colonne del mio frame di dati.dplyr :: select - Include tutte le altre colonne alla fine del nuovo data frame (o iniziale o centrale)

Un ottimo uso, se mi capita di lavorare con un df che ha molte colonne, mi trovo spesso a mettere due variabili l'una accanto all'altra per un facile confronto. Quando faccio questo, ho quindi bisogno di allegare tutte le altre colonne prima o dopo. Ho trovato la funzione matches(".") un modo super conveniente per farlo.

Ad esempio:

library(nycflights13) 
library(dplyr) 

# just have the five columns: 
select(flights, carrier, tailnum, year, month, day) 

# new order for all column: 
select(flights, carrier, tailnum, year, month, day, matches(".")) 
# matches(".") attached all other columns to end of new data frame 

La questione - Sono curioso di sapere se c'è un modo migliore per fare questo? Migliore nel senso di essere più flessibile.

Ad esempio di un problema: c'è un modo per includere "tutte le altre" colonne all'inizio o al centro del nuovo data.frame? (Si noti che select(flights, matches("."), year, month, day,) non produce risultato desiderato, dal momento che matches(".") allegato tutte le colonne e year, month, day vengono ignorati perché sono ripetizioni di nomi colonne esistenti.)

risposta

23

Se si desidera riordinare le colonne

  • tutte le altre colonne alla fine:
  • select(flights, carrier, tailnum, year, month, day, everything()) 
    

    O in due fasi, per selezionare le variabili previste in carattere vettoriale, one_of("x", "y", "z"):

    col <- c("carrier", "tailnum", "year", "month", "day") 
    select(flights, one_of(col), everything()) 
    

  • tutte le altre colonne all'inizio:
  • select(flights, -one_of(col), one_of(col)) 
    

    Se si vuole aggiungere tutti i frame di dati nuovo utilizzando dplyr:

  • Tutti i dati della struttura alla fine:
  • bind_cols(select(flights, one_of(col)), flights) 
    

  • Tutti i frame di dati all'inizio:
  • bind_cols(flights, select(flights, one_of(col))) 
    
    1

    Sebbene non sia una soluzione molto elegante, funziona.

    select(flights, carrier, tailnum, 
    one_of(setdiff(colnames(flights),c("carrier","tailnum","year"))),year) 
    

    Ho usato la funzione setdiff per confrontare. poiché select non accettano argomenti stringa, ho usato la funzione one_of. Per l'elenco di molte funzioni di utilità per l'argomento select è possibile fare riferimento a questo post.