Czy istnieje bardziej zwięzły sposób na pobranie jednej kolumny tabeli dplyr jako wektora z tabeli z zapleczem bazy danych (tj. Ramki / tabeli danych nie można bezpośrednio podzestawiać)?
require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL
To byłoby zbyt łatwe, więc
collect(select(iris2, Species))[, 1]
# [1] "setosa" "setosa" "setosa" "setosa" etc.
Ale wydaje się trochę niezdarne.
r
dplyr
lazy-evaluation
collect
nacnudus
źródło
źródło
collect(iris2)$Species
mniej niezdarny?Odpowiedzi:
Z dplyr 0.7.0 możesz użyć,
pull
aby uzyskać wektor z atbl
.źródło
Zgodnie z komentarzem @nacnudus wygląda na to, że
pull
funkcja została zaimplementowana w dplyr 0.6:W przypadku starszych wersji dplyr, oto zgrabna funkcja, która sprawia, że wyciąganie kolumny jest nieco ładniejsze (łatwiejsze do wpisania i czytelniejsze):
Dzięki temu możesz wykonać jedną z następujących czynności:
W rezultacie ...
Działa również dobrze z ramkami danych:
Dobry sposób na zrobienie tego w wersji 0.2 z
dplyr
:Lub jeśli wolisz:
A jeśli Twój stół nie jest za duży, po prostu ...
źródło
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]] }
więc możesz iść ziris2 %>% pull()
magrittr
operatora ekspozycji (%$%
), aby wyciągnąć wektor z ramki danych. tjiris2 %>% select(Species) %>% collect() %$% Species
.pull()
zostanie zaimplementowany w dplyr w wersji 0.6 github.com/tidyverse/dplyr/commit/…Możesz także użyć tego,
unlist
co uważam za łatwiejsze do odczytania, ponieważ nie musisz powtarzać nazwy kolumny ani określać indeksu.źródło
unlist
właśnie tego potrzebowałem. Dzięki!unlist
może również wyodrębniać wartości z wielu kolumn (łącząc wszystkie wartości w jeden wektor), aledplyr::pull
ogranicza się do jednej kolumny.Skorzystałbym z
extract2
funkcji wygody zmagrittr
:źródło
collect()
międzyselect
iextract2
?use_series(Species)
jest jeszcze bardziej czytelny. Dzięki za powiadomienie mnie o tych funkcjach, istnieje kilka innych przydatnych, skąd one pochodzą.Prawdopodobnie napisałbym:
Ponieważ dplyr jest przeznaczony do pracy z tabelami danych, nie ma lepszego sposobu na uzyskanie pojedynczej kolumny danych.
źródło
group_by(column) %.% tally()
drop = TRUE
dodplyr::select
byłby niesamowity w wielu przypadkach użycia, w których faktycznie musimy wyodrębnić wektory.@ Luke1018 zaproponował takie rozwiązanie w jednym z komentarzy:
Na przykład:
Myślałem, że zasługuje na własną odpowiedź.
źródło
tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()
i%>% unname()
jeśli chcesz, możesz też dodać kolejny na końcu, ale dla moich celów nie znalazłem tego ostatniego ogniwa łańcucha rurowego za konieczne. Możesz również określićuse.names = FALSE
wunlist()
poleceniu, które robi to samo, co dodanieunname()
do łańcucha rur.pull
polecenia. Moje rozwiązanie zostało napisane przeddplyr
wersją 0.6.%$%
działa na każdej liście,pull()
ale nieJeśli jesteś przyzwyczajony do używania nawiasów kwadratowych do indeksowania, inną opcją jest po prostu zawinięcie zwykłego podejścia do indeksowania wywołaniem funkcji deframe () , np .:
To i pull () to całkiem dobre sposoby na uzyskanie kolumny tibble.
źródło