Existe-t-il un moyen plus succinct d'obtenir une colonne d'un tbl dplyr en tant que vecteur, à partir d'un tbl avec une base de données principale (c'est-à-dire que la trame / table de données ne peut pas être directement sous-ensemble)?
require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL
Cela aurait été trop facile, alors
collect(select(iris2, Species))[, 1]
# [1] "setosa" "setosa" "setosa" "setosa" etc.
Mais cela semble un peu maladroit.
r
dplyr
lazy-evaluation
collect
nacnudus
la source
la source
collect(iris2)$Species
moins maladroit?Réponses:
Avec dplyr 0.7.0, vous pouvez utiliser
pull
pour obtenir un vecteur à partir d'un fichiertbl
.la source
Selon le commentaire de @nacnudus, il semble qu'une
pull
fonction a été implémentée dans dplyr 0.6:Pour les anciennes versions de dplyr, voici une fonction intéressante pour rendre l'extraction d'une colonne un peu plus agréable (plus facile à taper et plus facile à lire):
Cela vous permet de faire l'une des choses suivantes:
Résultant en...
Et cela fonctionne également très bien avec les trames de données:
Une bonne façon de faire cela dans la v0.2 de
dplyr
:Ou si vous préférez:
Ou si votre table n'est pas trop grande, tout simplement ...
la source
pull <- function(x, y) { if (ncol(x) == 1) y <- 1 else y x[ , if (is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]] }
vous pouvez donc y aller aveciris2 %>% pull()
magrittr
opérateur d'exposition (%$%
) pour extraire un vecteur d'un bloc de données. ieiris2 %>% select(Species) %>% collect() %$% Species
.pull()
sera implémenté dans la version 0.6 de dplyr github.com/tidyverse/dplyr/commit/…Vous pouvez également utiliser
unlist
ce que je trouve plus facile à lire car vous n'avez pas besoin de répéter le nom de la colonne ou de spécifier l'index.la source
unlist
c'est précisément ce dont j'avais besoin. Merci!unlist
peut également extraire des valeurs de plusieurs colonnes (combinant toutes les valeurs dans un seul vecteur), tout endplyr::pull
étant limité à une seule colonne.J'utiliserais la
extract2
fonction de commodité demagrittr
:la source
collect()
entreselect
etextract2
?use_series(Species)
est peut-être encore plus lisible. Merci de m'avoir alerté sur ces fonctions, il y en a plusieurs autres pratiques d'où cela vient.J'écrirais probablement:
Puisque dplyr est conçu pour travailler avec des tbls de données, il n'y a pas de meilleur moyen d'obtenir une seule colonne de données.
la source
group_by(column) %.% tally()
drop = TRUE
dedplyr::select
serait incroyable pour les très nombreux cas d'utilisation où nous avons réellement besoin pour extraire les vecteurs.@ Luke1018 a proposé cette solution dans l'un des commentaires:
Par exemple:
J'ai pensé qu'il méritait sa propre réponse.
la source
tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()
et vous pouvez également en ajouter un autre%>% unname()
à la fin si vous le souhaitez, mais pour mes besoins, je n'ai pas trouvé que le dernier maillon de la chaîne de tuyaux était nécessaire. Vous pouvez également spécifieruse.names = FALSE
dans launlist()
commande, qui fait la même chose que l'ajoutunname()
sur la chaîne de tuyaux.pull
commande maintenant. Ma solution a été écrite avant ladplyr
version 0.6.%$%
travaux sur une liste, alors quepull()
ne le fait pasSi vous avez l'habitude d'utiliser des crochets pour l'indexation, une autre option consiste simplement à envelopper l'approche d'indexation habituelle dans un appel à deframe () , par exemple:
Cela et pull () sont tous deux de très bons moyens d'obtenir une colonne tibble.
la source