Извлеките столбец dplyr tbl в виде вектора

Есть ли более краткий способ получить один столбец dplyr tbl в качестве вектора, из tbl с базой данных базы данных (т. Е. Кадр данных / таблица не может быть подмножеством напрямую)?

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. 

Но это кажется немного неуклюжим.

С dplyr 0.7.0 вы можете использовать pull для получения вектора из tbl .

 library("dplyr") #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union db <- src_sqlite(tempfile(), create = TRUE) iris2 <- copy_to(db, iris) vec <- pull(iris2, Species) head(vec) #> [1] "setosa" "setosa" "setosa" "setosa" "setosa" "setosa" 

Согласно комментарию от @nacnudus, похоже, что функция pull была реализована в dplyr 0.6:

 iris2 %>% pull(Species) 

Для более старых версий dplyr, вот аккуратная функция, позволяющая вытащить столбец немного лучше (проще набрать и легче читать):

 pull <- function(x,y) {x[,if(is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]]} 

Это позволяет вам выполнить одно из следующих действий:

 iris2 %>% pull('Species') iris2 %>% pull(Species) iris2 %>% pull(5) 

В результате чего...

  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4 

И он отлично работает с кадрами данных:

 > mtcars %>% pull(5) [1] 3.90 3.90 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 3.92 3.07 3.07 3.07 2.93 3.00 3.23 4.08 4.93 4.22 3.70 2.76 3.15 3.73 3.08 4.08 4.43 [28] 3.77 4.22 3.62 3.54 4.11 

Хороший способ сделать это в v0.2 dplyr :

 iris2 %>% select(Species) %>% collect %>% .[[5]] 

Или, если вы предпочитаете:

 iris2 %>% select(Species) %>% collect %>% .[["Species"]] 

Или, если ваш стол не слишком большой, просто ...

 iris2 %>% collect %>% .[["Species"]] 

Вы также можете использовать unlist который мне легче читать, потому что вам не нужно повторять имя столбца или указать индекс.

 iris2 %>% select(Species) %>% unlist(use.names = FALSE) 

Я бы использовал extract2 удобства magrittr от magrittr :

 library(magrittr) library(dplyr) iris2 %>% select(Species) %>% extract2(1) 

Я бы, наверное, написал:

 collect(select(iris2, Species))[[1]] 

Поскольку dplyr предназначен для работы с tbls данных, нет лучшего способа получить один столбец данных.

@ Luke1018 предложил это решение в одном из комментариев:

Вы также можете использовать magrittr изложения magrittr ( %$% ), чтобы вытащить вектор из фрейма данных.

Например:

 iris2 %>% select(Species) %>% collect() %$% Species 

Я думал, что это заслуживает собственного ответа.

  • Коэффициент переупорядочения дает разные результаты, в зависимости от того, какие пакеты загружены
  • Форматирование десятичных знаков в R
  • Разбиение имени файла на имя, расширение
  • dplyr :: select вызовы функции с помощью MASS :: select
  • ggplot2 пирог и диаграмма пончика на том же участке
  • data.table join, затем добавьте столбцы в существующий файл data.frame без повторной копии
  • Удаление дублированных строк с помощью dplyr
  • ggmap Ошибка: GeomRasterAnn был построен с несовместимой версией ggproto
  • Как просмотреть исходный код для функции?
  • Затенение графика плотности ядра между двумя точками.
  • Динамически строить вызов для поиска нескольких столбцов
  • Interesting Posts

    Почему интерфейсы C # не могут содержать поля?

    Отрегулировать яркость экрана непосредственно с панели задач в Windows 8?

    Запрос данных об общих данных данных с помощью SPARQL

    How To: Настольный компьютер как сервер, ноутбук как «тонкий клиент»?

    Как использовать конструкторы базового classа и оператор присваивания в C ++?

    Доступ к членам classа по указателю NULL

    Эмулятор: ERROR: эмуляция x86 в настоящее время требует аппаратного ускорения

    AVFoundation + AssetWriter: создайте фильм с изображениями и аудио

    Моческое статическое свойство с moq

    Как перенаправить вывод всего скрипта оболочки внутри самого скрипта?

    Как преобразовать строку даты в текущий часовой пояс в командной строке?

    Каков наилучший способ изучения jQuery?

    Удаление определенных строк из фрейма данных

    Наследование Java – переопределение переменных экземпляра

    Шифрование / Расшифровка больших файлов (.NET)

    Давайте будем гением компьютера.