Estrai una colonna tbl di dplyr come un vettore

C’è un modo più sintetico per ottenere una colonna di un tbl di dplyr come un vettore, da un tbl con un back-end del database (cioè il frame / tabella dati non può essere sottoinsieme direttamente)?

require(dplyr) db <- src_sqlite(tempfile(), create = TRUE) iris2 <- copy_to(db, iris) iris2$Species # NULL 

Sarebbe stato troppo facile, quindi

 collect(select(iris2, Species))[, 1] # [1] "setosa" "setosa" "setosa" "setosa" etc. 

Ma sembra un po ‘goffo.

    Con dplyr 0.7.0, puoi usare pull per ottenere un vettore da un tbl .

     library("dplyr") #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union db < - src_sqlite(tempfile(), create = TRUE) iris2 <- copy_to(db, iris) vec <- pull(iris2, Species) head(vec) #> [1] "setosa" "setosa" "setosa" "setosa" "setosa" "setosa" 

    Come per il commento di @nacnudus, sembra che una funzione pull stata implementata in dplyr 0.6:

     iris2 %>% pull(Species) 

    Per le versioni precedenti di dplyr, ecco una funzione utile per rendere più semplice l’estrazione di una colonna (più facile da scrivere e più facile da leggere):

     pull < - function(x,y) {x[,if(is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]]} 

    Questo ti permette di fare uno di questi:

     iris2 %>% pull('Species') iris2 %>% pull(Species) iris2 %>% pull(5) 

    Con il risultato di...

      [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4 

    E funziona anche bene con i frame di dati:

     > mtcars %>% pull(5) [1] 3.90 3.90 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 3.92 3.07 3.07 3.07 2.93 3.00 3.23 4.08 4.93 4.22 3.70 2.76 3.15 3.73 3.08 4.08 4.43 [28] 3.77 4.22 3.62 3.54 4.11 

    Un bel modo per farlo nella v0.2 di dplyr :

     iris2 %>% select(Species) %>% collect %>% .[[5]] 

    O se preferisci:

     iris2 %>% select(Species) %>% collect %>% .[["Species"]] 

    O se il tuo tavolo non è troppo grande, semplicemente ...

     iris2 %>% collect %>% .[["Species"]] 

    Puoi anche usare unlist che trovo più facile da leggere perché non hai bisogno di ripetere il nome della colonna o specificare l’indice.

     iris2 %>% select(Species) %>% unlist(use.names = FALSE) 

    Vorrei usare la funzione di magrittr da magrittr :

     library(magrittr) library(dplyr) iris2 %>% select(Species) %>% extract2(1) 

    Probabilmente scriverò:

     collect(select(iris2, Species))[[1]] 

    Poiché dplyr è progettato per lavorare con tbl di dati, non esiste un modo migliore per ottenere una singola colonna di dati.

    @ Luke1018 ha proposto questa soluzione in uno dei commenti:

    È inoltre ansible utilizzare l’operatore di esposizione magrittr ( %$% ) per estrarre un vettore da un frame di dati.

    Per esempio:

     iris2 %>% select(Species) %>% collect() %$% Species 

    Pensavo che meritasse la sua risposta.