Есть ли более краткий способ получить один столбец таблицы dplyr в качестве вектора из таблицы с базой данных (т. Е. Фрейм / таблица данных не может быть поднабором напрямую)?
require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL
Это было бы слишком легко, так
collect(select(iris2, Species))[, 1]
# [1] "setosa" "setosa" "setosa" "setosa" etc.
Но это кажется немного неуклюжим.
r
dplyr
lazy-evaluation
collect
nacnudus
источник
источник
collect(iris2)$Species
менее неуклюжим?Ответы:
С dplyr 0.7.0, вы можете использовать,
pull
чтобы получить вектор изtbl
.источник
Согласно комментарию @nacnudus, похоже, что
pull
функция была реализована в dplyr 0.6:Для более старых версий dplyr, вот изящная функция, которая делает вытягивание столбца более приятным (легче набирать и легче читать):
Это позволяет вам выполнить одно из следующих действий:
В результате чего...
И это также прекрасно работает с фреймами данных:
Хороший способ сделать это в v0.2 из
dplyr
:Или, если вы предпочитаете:
Или, если ваш стол не слишком большой, просто ...
источник
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]] }
так что вы можете пойти сiris2 %>% pull()
magrittr
оператор экспозиции (%$%
), чтобы извлечь вектор из фрейма данных. то естьiris2 %>% select(Species) %>% collect() %$% Species
.pull()
будет осуществляться в dplyr версии 0,6 github.com/tidyverse/dplyr/commit/...Вы также можете использовать то,
unlist
что мне легче читать, потому что вам не нужно повторять имя столбца или указывать индекс.источник
unlist
именно то, что мне было нужно. Спасибо!unlist
также может извлекать значения из нескольких столбцов (объединяя все значения в один вектор), приdplyr::pull
этом ограничивается одним столбцом.Я бы использовал
extract2
удобную функцию изmagrittr
:источник
collect()
междуselect
иextract2
?use_series(Species)
возможно, даже более читабельным. Спасибо, что предупредили меня об этих функциях, есть несколько других полезных, откуда это пришло.Я бы наверное написал:
Поскольку dplyr предназначен для работы с таблицами данных, лучшего способа получить один столбец данных не существует.
источник
group_by(column) %.% tally()
drop = TRUE
былdplyr::select
бы удивительным для довольно многих случаев использования, когда нам действительно нужно извлечь векторы.@ Luke1018 предложил это решение в одном из комментариев:
Например:
Я думал, что это заслуживает своего собственного ответа.
источник
tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()
и вы также можете добавить еще один%>% unname()
в конце, если хотите, но для моих целей я не нашел нужного последнего звена цепи труб. Вы также можете указатьuse.names = FALSE
вunlist()
команде, которая делает то же самое, что и добавлениеunname()
в цепочку каналов.pull
команду сейчас. Мое решение было написано доdplyr
версии 0.6.%$%
работает в любом списке, аpull()
неЕсли вы привыкли использовать квадратные скобки для индексации, другой вариант - просто обернуть обычный подход к индексированию в вызове deframe () , например:
Это и pull () являются довольно хорошими способами получить столбец tibble.
источник