2016-05-29 2 views
1

Als ich die Hilfeseite der Scheibe Funktion des dplyr Pakets zu verstehen, kann man die Zeilen eines SQL-TBL oder einen SQLite-TBL wie folgt wählen:Wie extrahiert man eine Teilmenge eines tbl_mysql oder tbl_sqlite Datenrahmens nach Zeilennummern?

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

aber ich erhalte eine Fehlermeldung, wenn ich versuche:

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) 

Die Fehlermeldung tritt hier:

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

das gleiche Problem mit MySQL:

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

Der Fehler:

> 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 

Natürlich kann ich eine neue Spalte mit den Zeilennummern erstellen, aber ich frage mich, warum filter(mtcars, row_number() == 1L) funktioniert nicht.

+0

Sie versuchte 'dplyr :: filter()'? – mtoto

+0

Dies ist 'dplyr :: filter'. –

+0

Sie können auch nach 'dplyr :: slice' schauen. –

Antwort

0

Sie können dies versuchen:

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

danke, aber wenn man 'sammelt', dann ist die' tbl_sqlite' Klasse verloren. –

+0

Aber das ist keine schlechte Idee. Nach dem 'collect' kann man den Datenrahmen als normales' tbl' behandeln und dann wieder in die Datenbank kopieren (mit 'copy_to'). –

+0

mmhhh ... endlich ist es kein guter Weg, weil ich es nicht in die Datenbank kopieren möchte, weil es nicht der "letzte" Datenrahmen ist. Jedenfalls löst das das Problem nicht wirklich, aber es ist ein möglicher Weg zu gehen. –