提取dplyr tbl列作为向量

提取dplyr tbl列作为向量,r,dplyr,lazy-evaluation,collect,R,Dplyr,Lazy Evaluation,Collect,是否有一种更简洁的方法从带有数据库后端的tbl(即数据帧/表不能直接被子集)获取dplyr tbl的一列作为向量 require(dplyr) db <- src_sqlite(tempfile(), create = TRUE) iris2 <- copy_to(db, iris) iris2$Species # NULL 但这似乎有点笨拙。我可能会写: collect(select(iris2, Species))[[1]] 由于dplyr是专为处理TBL数据而设计的,因此没

是否有一种更简洁的方法从带有数据库后端的tbl(即数据帧/表不能直接被子集)获取dplyr tbl的一列作为向量

require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL
但这似乎有点笨拙。

我可能会写:

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

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

根据@nacnudus的评论,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]]}
导致

 [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
在dplyr的v0.2中执行此操作的一个好方法:

或者,如果您愿意:

iris2 %>% select(Species) %>% collect %>% .[["Species"]]
或者如果你的桌子不是太大,简单地说

iris2 %>% collect %>% .[["Species"]]
我将使用magrittr的extract2便利功能:

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

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

@Luke1018在其中一条评论中提出了该解决方案:

还可以使用magrittr exposition运算符%$%从数据帧中提取向量

例如:

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

我认为它应该有自己的答案。

当dplyr>=0.7.0时,您可以使用pull从tbl获取向量

图书馆弹琴 > >正在附加包:“dplyr” >以下对象已从“package:stats”屏蔽: > >滤波器,滞后 >以下对象已从“package:base”屏蔽: > >相交、setdiff、setequal、并集
db如果您习惯于使用方括号进行索引,另一种选择是只在调用中使用常用的索引方法,例如:

图书馆管理员
iris2说的再公平不过了。当我尝试使用uniquetable$column检查伪值时,它在控制台中以交互方式出现。@nacnudus在这种情况下,您也可以按column%执行group_.。%tallyAn argument drop=TRUE to dplyr::select对于我们实际需要提取向量的许多用例来说将是惊人的。这是我获得列的唯一方法从我的sdf里。Pull在版本0.7.8上对我不起作用。你是想在select和extract2之间使用collect吗?use_seriesSpecies可能更具可读性。谢谢你提醒我这些函数,还有其他几个方便的函数,我喜欢你的pull函数。我只想为只有一个变量的情况添加一个简化:pull您还可以使用magrittr exposition操作符%$%从数据帧中提取向量。i、 e.iris2%>%selectSpecies%>%collect%$%Species.@Luke1018您应该根据此注释创建答案Pull将在dplyr版本0.6中实现这似乎是最通用的方法,因为它与vectors和data.frames的工作原理相同,也就是说,它使函数变得更加不可知。我只是在寻找这个确切问题的答案,而不列出正是我所需要的。谢谢unlist还可以从多个列中提取值,将所有值合并到一个向量中,而dplyr::pull仅限于一个列。collectiris2$Species是否不那么笨拙?我正在寻找这个问题。如果我不想传递colname本身,而是要传递包含它的字符串变量,我该如何做?@mzuba tibblex=1:10,y=letters[1:10]%%>%select_x%%>%unlist,如果需要,您也可以在末尾添加另一个%>%unname,但出于我的目的,我发现最后一个管道链链接不是必需的。您还可以在unlist命令中指定use.names=FALSE,这与将unname添加到管道链中的操作相同。@mzuba我现在将使用pull命令。我的解决方案是在dplyr版本0.6之前编写的。请注意,%$%适用于任何列表,而pull不适用
iris2 %>% collect %>% .[["Species"]]
library(magrittr)
library(dplyr)

iris2 %>%
  select(Species) %>%
  extract2(1)  
iris2 %>% select(Species) %>% unlist(use.names = FALSE)
iris2 %>% select(Species) %>% collect() %$% Species