2015-09-02 13 views
5
arm<-as.data.frame(matrix(c(1,1,1,2,2,6,7,4,9,10),ncol=2)) 

colnames(arm)<-c("a","b") 

Ciao ragazzi, questo è un insieme di dati che ho creato in R. Ora voglio classificare il b colonna e di gruppo per colonna a. Il seguente frammento di codice sta gettando questo errore, non importa quello che faccio modifiche alla sintassi (come l'aggiunta di [], "", ecc ...)Impossibile utilizzare rango() su funzioni in R utilizzando sqldf

*****Error in sqliteSendQuery(con, statement, bind.data) : error in statement: near "(": syntax error*****

stavo usando "pacchetto sqldf".

arm2<-sqldf("select a, 
     b, 
     rank() over (partition by a order by b) as rank1 
     from arm") 

Poi ho installato il pacchetto RH2 e ha iniziato a lanciare il seguente errore:

Error in .verify.JDBC.result(s, "Unable to execute JDBC statement ", statement) : Unable to execute JDBC statement select a, b, rank() over (partition by a order by b) as rank1 from arm (Function "rank" not found; SQL statement: select a, b, rank() over (partition by a order by b) as rank1 from arm [90022-175])

per favore potete dirmi come utilizzare rango() sopra la funzione di SQL nel pacchetto sqldf di R. Grazie.

+4

downvote sembra un po 'dura. La domanda delinea il pacchetto utilizzato, i dati utilizzati, il codice utilizzato e i messaggi di errore. Considerando alcune delle schifezze che vengono svalutate qui, mostra uno sforzo per spiegare il problema. – thelatemail

+4

rsqldf usa sqlite di default, che non ha una funzione rank(). Non ho familiarità con RH2, ma sembra che ti abbia lo stesso problema. Puoi provare postgresql seguendo gli esempi [da qui] (https://github.com/ggrothendieck/sqldf#12-how-does-one-use-sqldf-with-postgresql) – jeremycg

+0

Non capisco questa domanda. È una segnalazione di bug? In tal caso, si prega di segnalare [GH] (https://github.com/ggrothendieck/sqldf/issues). O stai cercando una soluzione generale? In tal caso, questo errore dovrebbe essere rilevante solo per mostrare il tuo sforzo iniziale, e quindi puoi usare alcune altre alternative come "arm $ rank1 <- unlist (con (arm, tapply (b, a, rank))) ', per esempio. –

risposta

2

sqldf utilizza SQLite che non supporta la funzione rank() - see here. Dal messaggio di errore che hai ottenuto da H2, non lo è neanche, anche se è currently planned.

sqldf è in grado di utilizzare PostgreSQL anziché SQLite, che supporta rank(): see here per un esempio. Il tuo codice come pubblicato dovrebbe quindi funzionare.

Se don; t vuole usare PostgreSQL, è possibile ottenere i dati fuori nel giusto ordine con SQLite e sqldf utilizzando:

sqldf("select a, b from arm 
      order by a, b", drv = "SQLite") 

ma la colonna classifica è più difficile - vedere alcune risposte correlati: 1, 2, 3

Dal momento che siete già in R, si potrebbe usare dplyr, un pacchetto R origini:

library(dplyr) 
arm %>% group_by(a) %>% 
     mutate(rank = rank(b)) 

O data.table, un'alternativa più veloce:

library(data.table) 
setDT(arm)[ , rank := rank(b), by = a] 
+2

Nota che se vuoi davvero usare SQLite allora: 'a1 <- sqldf (" seleziona a, b da arm order by a, b "); min_rowid <- sqldf ("seleziona x. *, min (y.rowid) min_rowid da a1 x a sinistra unisciti a1 y utilizzando (a) gruppo per x.a"); sqldf ("seleziona a1.*, a1.rowid - min_rowid + 1 rank da a1 join min_rowid utilizzando (a) ")' –