Gibt es eine prägnantere Möglichkeit, eine Spalte eines dplyr tbl als Vektor aus einem tbl mit Datenbank-Backend zu erhalten (dh der Datenrahmen / die Tabelle kann nicht direkt untergeordnet werden)?
require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL
Das wäre also zu einfach gewesen
collect(select(iris2, Species))[, 1]
# [1] "setosa" "setosa" "setosa" "setosa" etc.
Aber es scheint ein bisschen ungeschickt.
r
dplyr
lazy-evaluation
collect
Nacnudus
quelle
quelle
collect(iris2)$Species
weniger ungeschickt?Antworten:
Mit dplyr 0.7.0 können Sie
pull
einen Vektor von a erhaltentbl
.quelle
Laut dem Kommentar von @nacnudus scheint eine
pull
Funktion in dplyr 0.6 implementiert worden zu sein:Für ältere Versionen von dplyr gibt es eine nette Funktion, um das Herausziehen einer Spalte ein bisschen schöner zu machen (einfacher zu tippen und leichter zu lesen):
Auf diese Weise können Sie eine der folgenden Aktionen ausführen:
Ergebend...
Und es funktioniert auch gut mit Datenrahmen:
Ein guter Weg, dies in Version 0.2 von zu tun
dplyr
:Oder wenn Sie es vorziehen:
Oder wenn Ihr Tisch nicht zu groß ist, einfach ...
quelle
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]] }
Sie können also mitiris2 %>% pull()
magrittr
Expositionsoperator (%$%
) verwenden, um einen Vektor aus einem Datenrahmen zu ziehen. dhiris2 %>% select(Species) %>% collect() %$% Species
.pull()
wird in dplyr Version 0.6 implementiert github.com/tidyverse/dplyr/commit/…Sie können auch verwenden,
unlist
was ich leichter zu lesen finde, da Sie den Namen der Spalte nicht wiederholen oder den Index angeben müssen.quelle
unlist
bin genau das, was ich brauchte. Vielen Dank!unlist
kann auch Werte aus mehreren Spalten extrahieren (alle Werte zu einem einzigen Vektor kombinieren), während diesdplyr::pull
auf eine einzelne Spalte beschränkt ist.Ich würde die
extract2
Komfortfunktion von verwendenmagrittr
:quelle
collect()
zwischenselect
und verwendenextract2
?use_series(Species)
ist vielleicht noch besser lesbar. Vielen Dank, dass Sie mich auf diese Funktionen aufmerksam gemacht haben. Es gibt noch einige andere nützliche Funktionen, von denen diese stammen.Ich würde wahrscheinlich schreiben:
Da dplyr für die Arbeit mit Datenblöcken ausgelegt ist, gibt es keinen besseren Weg, um eine einzelne Datenspalte abzurufen.
quelle
group_by(column) %.% tally()
drop = TRUE
dafürdplyr::select
wäre erstaunlich für die vielen Anwendungsfälle, in denen wir die Vektoren tatsächlich extrahieren müssen.@ Luke1018 schlug diese Lösung in einem der Kommentare vor:
Beispielsweise:
Ich dachte, es hätte eine eigene Antwort verdient.
quelle
tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()
und Sie könnten%>% unname()
am Ende auch ein weiteres hinzufügen, wenn Sie möchten, aber für meine Zwecke habe ich nicht festgestellt, dass das letzte Rohrkettenglied notwendig ist. Sie können auchuse.names = FALSE
imunlist()
Befehl angeben , was dasselbe tut wie das Hinzufügenunname()
zur Rohrkette.pull
jetzt den Befehl verwenden. Meine Lösung wurde vordplyr
Version 0.6 geschrieben.%$%
auf jeder Liste funktioniert, währendpull()
nichtWenn Sie es gewohnt sind, eckige Klammern für die Indizierung zu verwenden, können Sie auch den üblichen Indizierungsansatz in einen Aufruf von deframe () einschließen , z.
Das und pull () sind beide ziemlich gute Möglichkeiten, eine Tibble-Spalte zu erhalten.
quelle