sqldf 使用 SQLite,它不支持rank()
功能 -see here http://www2.sqlite.org/cvstrac/wiki?p=UnsupportedSqlAnalyticalFunctions。从你从 H2 得到的错误消息来看,它也没有,尽管它是目前计划的 http://www.h2database.com/html/roadmap.html.
sqldf 能够使用 PostgreSQL 而不是 SQLite,后者确实支持rank():see here https://github.com/ggrothendieck/sqldf#12-how-does-one-use-sqldf-with-postgresql举个例子。然后您发布的代码应该可以工作。
如果您不想使用 PostgreSQL,您可以使用 SQLite 和 sqldf 以正确的顺序获取数据:
sqldf("select a, b from arm
order by a, b", drv = "SQLite")
但排名一栏比较困难 - 请参阅一些相关答案:1 https://stackoverflow.com/questions/5682886/retrieve-rank-from-sqlite-table, 2 https://stackoverflow.com/questions/15946580/sql-ranking-query-to-compute-ranks-and-median-in-sub-groups, 3 https://stackoverflow.com/questions/16847574/how-to-use-row-number-in-sqlite
由于您已经在 R 中,您可以使用dplyr
,一个原生的 R 包:
library(dplyr)
arm %>% group_by(a) %>%
mutate(rank = rank(b))
Or data.table
,更快的替代方案:
library(data.table)
setDT(arm)[ , rank := rank(b), by = a]