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的功能.谢谢.
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)
由于您已经在使用 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)