是否有更简洁的方法来获得一个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.

但是看起来有点笨拙。


当前回答

如果你习惯于使用方括号进行索引,另一种选择是在调用deframe()中包装通常的索引方法,例如:

library(tidyverse)

iris2 <- as_tibble(iris)

# using column name
deframe(iris2[, 'Sepal.Length'])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

# using column number
deframe(iris2[, 1])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

That和pull()都是获取tibble列的好方法。

其他回答

我可能会这样写:

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

由于dplyr是为处理表数据而设计的,因此没有更好的方法来获取单列数据。

如果你习惯于使用方括号进行索引,另一种选择是在调用deframe()中包装通常的索引方法,例如:

library(tidyverse)

iris2 <- as_tibble(iris)

# using column name
deframe(iris2[, 'Sepal.Length'])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

# using column number
deframe(iris2[, 1])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

That和pull()都是获取tibble列的好方法。

您还可以使用unlist,我发现它更容易阅读,因为您不需要重复列的名称或指定索引。

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

使用dplyr >= 0.7.0,您可以使用pull()从tbl中获取一个向量。


library(dplyr, warn.conflicts = FALSE)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
vec <- pull(iris2, Species)
head(vec)
#> [1] "setosa" "setosa" "setosa" "setosa" "setosa" "setosa"

我会使用magrittr中的extract2方便函数:

library(magrittr)
library(dplyr)

iris2 %>%
  select(Species) %>%
  extract2(1)