Existe uma maneira mais sucinta de obter uma coluna de um dplyr tbl como vetor, de um tbl com back-end de banco de dados (ou seja, o quadro / tabela de dados não pode ser subconjunto diretamente)?
require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL
Isso teria sido fácil demais, então
collect(select(iris2, Species))[, 1]
# [1] "setosa" "setosa" "setosa" "setosa" etc.
Mas parece um pouco desajeitado.
r
dplyr
lazy-evaluation
collect
nacnudus
fonte
fonte
collect(iris2)$Species
menos desajeitado?Respostas:
Com o dplyr 0.7.0, você pode usar
pull
para obter um vetor de atbl
.fonte
De acordo com o comentário do @nacnudus, parece que uma
pull
função foi implementada no dplyr 0.6:Para versões mais antigas do dplyr, aqui está uma função interessante para tornar a extração de uma coluna um pouco melhor (mais fácil de digitar e mais fácil de ler):
Isso permite que você execute um destes procedimentos:
Resultando em...
E também funciona bem com quadros de dados:
Uma boa maneira de fazer isso na v0.2 de
dplyr
:Ou se você preferir:
Ou se sua mesa não for muito grande, simplesmente ...
fonte
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]] }
assim que você pode ir comiris2 %>% pull()
magrittr
operador de exposição (%$%
) para extrair um vetor de um quadro de dados. ieiris2 %>% select(Species) %>% collect() %$% Species
.pull()
será implementado em dplyr versão 0.6 github.com/tidyverse/dplyr/commit/...Você também pode usar o
unlist
que eu acho mais fácil de ler, porque você não precisa repetir o nome da coluna ou especificar o índice.fonte
unlist
é exatamente o que eu precisava. Obrigado!unlist
também pode extrair valores de várias colunas (combinando todos os valores em um único vetor), enquantodplyr::pull
está limitado a uma única coluna.Eu usaria a
extract2
função de conveniência demagrittr
:fonte
collect()
entreselect
eextract2
?use_series(Species)
é talvez ainda mais legível. Obrigado por me alertar sobre essas funções, existem várias outras úteis de onde elas vieram.Eu provavelmente escreveria:
Como o dplyr foi projetado para trabalhar com tbls de dados, não há melhor maneira de obter uma única coluna de dados.
fonte
group_by(column) %.% tally()
drop = TRUE
paradplyr::select
seria incrível para os muito muitos casos de uso em que realmente precisa para extrair os vetores.@ Luke1018 propôs esta solução em um dos comentários:
Por exemplo:
Eu pensei que merecia sua própria resposta.
fonte
tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()
e você também pode adicionar outro%>% unname()
no final, se quiser, mas para os meus propósitos, não achei o último elo da corrente do tubo necessário. Você também pode especificaruse.names = FALSE
nounlist()
comando, que faz o mesmo que adicionarunname()
na cadeia de tubos.pull
comando agora. Minha solução foi escrita antes dadplyr
versão 0.6.%$%
funciona em qualquer lista, enquantopull()
nãoSe você está acostumado a usar colchetes para indexação, outra opção é apenas envolver a abordagem de indexação usual em uma chamada para deframe () , por exemplo:
Isso e pull () são maneiras muito boas de obter uma coluna de petiscos.
fonte