使用sqldf无法对R中的函数使用rank()

Bil*_*nov 6 sql syntax r sqldf

arm<-as.data.frame(matrix(c(1,1,1,2,2,6,7,4,9,10),ncol=2))

colnames(arm)<-c("a","b")
Run Code Online (Sandbox Code Playgroud)

大家好,这是我在R中创建的数据集.现在我想按列a对列b和组进行排名.无论我对语法做了什么改变(比如添加[],""等等),下面这段代码都会抛出这个错误.

*****sqliteSendQuery中的错误(con,statement,bind.data):语句中的错误:near"(":语法错误*****

我正在使用"sqldf"包.

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

然后我安装了RH2包,它开始抛出以下错误:

.verify.JDBC.result中的错误(s,"无法执行JDBC语句",语句):无法执行JDBC语句选择a,b,rank()over(按b排序)作为rank1 from arm(函数)找不到"rank"; SQL语句:从arm [90022-175]中选择a,b,rank()(按b的顺序划分)作为rank1

你能告诉我如何在R的sqldf包中使用rank()而不是sql的功能.谢谢.

jer*_*ycg 3

sqldf 使用不支持该rank()功能的 SQLite -请参阅此处。从您从 H2 收到的错误消息来看,它也没有,尽管目前是计划中的

sqldf 能够使用 PostgreSQL 而不是 SQLite,后者确实支持rank():请参阅此处的示例。然后您发布的代码应该可以工作。

如果您不想使用 PostgreSQL,您可以使用 SQLite 和 sqldf 以正确的顺序获取数据:

sqldf("select a, b from arm 
          order by a, b", drv = "SQLite")
Run Code Online (Sandbox Code Playgroud)

但排名栏更难 - 请参阅一些相关答案1、2、3

由于您已经在使用 R,因此您可以使用dplyr本机 R 包:

library(dplyr)
arm %>% group_by(a) %>%
        mutate(rank = rank(b))
Run Code Online (Sandbox Code Playgroud)

或者data.table,更快的替代方案:

library(data.table)
setDT(arm)[ , rank := rank(b), by = a]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您确实想使用 SQLite,则: `a1 &lt;- sqldf("select a, b from arm order by a, b"); min_rowid &lt;- sqldf("选择 x.*, min(y.rowid) min_rowid from a1 x left join a1 y using(a) group by xa"); sqldf("选择 a1.*, a1.rowid - min_rowid + 1 从 a1 加入 min_rowid 使用(a)")` (2认同)