2016-05-29 35 views
1

据我了解dplyr包的片功能的帮助页面,可以选择一个SQL TBL的行或一个SQLite TBL是这样的:如何按行号提取tbl_mysql或tbl_sqlite数据框的子集?

filter(mtcars, row_number() == 1L) 

不过,我得到一个错误,当我尝试:

dat1 <- data.frame(
    Name = c("Joe", "Bill", "Jim", "Kate"), 
    Value = c(10.1, 9, 7.7, -3), 
    Indic = c(0L, 1L, 2L, 2L), 
    Status = c(TRUE, TRUE, FALSE, FALSE) 
) 
#### Create SQLite database #### 
library(dplyr) 
my_database <- src_sqlite("db_sqlite_file", create = TRUE) 
#### Put data in database #### 
copy_to(my_database, dat1, temporary = FALSE) 
#### Connect to database #### 
my_db <- src_sqlite("db_sqlite_file", create = FALSE) 
#### Querying the database #### 
dd <- tbl(my_db, "dat1") 
ddextract <- filter(dd, row_number() == 1L) 

错误消息出现在这里:

> ddextract 
Source: sqlite 3.8.6 [db_sqlite_file] 
Error in sqliteSendQuery(con, statement, bind.data) : 
    error in statement: no such function: ROW_NUMBER 

与MySQL同样的问题:

my_db_sql <- src_mysql("mysql_dplyr", password="mypassword") 
dd <- tbl(my_db_sql, "dat1") 
ddextract <- filter(dd, row_number() == 1L) 

错误:

> ddextract 
Source: mysql 5.5.49-0ubuntu0.14.04.1 [[email protected]:/mysql_dplyr] 
Error in .local(conn, statement, ...) : 
    could not run statement: FUNCTION mysql_dplyr.ROW_NUMBER does not exist 

当然我可以创建与行数的新列,但我不知道为什么filter(mtcars, row_number() == 1L)不起作用。

+0

你尝试'dplyr ::滤波器()'? – mtoto

+0

这是'dplyr :: filter'。 –

+0

你也可以看看'dplyr :: slice' –

回答

0

你可以试试这个:

ddextract <- dd %>% collect() %>% filter(row_number() == 1L) 
+0

谢谢,但是如果有'collect',那么'tbl_sqlite'类会丢失。 –

+0

但这不是一个坏主意。在完成'collect'之后,可以将数据帧视为通常的'tbl',然后将其复制回数据库(使用'copy_to')。 –

+0

mmhhh ...终于没有它不是一个好的方法,因为我不想将它复制到数据库,因为它不是“最终”数据框。无论如何,这并不能真正解决问题,但这是一条可行的途径。 –