【问题标题】:Unable to use rank() over functions in R using sqldf无法在 R 中使用 sqldf 对函数使用 rank()
【发布时间】:2015-11-28 14:56:38
【问题描述】:
arm<-as.data.frame(matrix(c(1,1,1,2,2,6,7,4,9,10),ncol=2))

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

这是我在 R 中创建的数据集。

现在我想对 b 列进行排名并按 a 列分组。

无论我对语法进行什么更改(如添加 []、“”等...),以下代码都会引发此错误

sqliteSendQuery(con, statement, bind.data) 中的错误:语句中的错误:接近“(”:语法错误

我使用的是“sqldf”包。

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

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

.verify.JDBC.result(s, "Unable to execute JDBC statement ", statement) 中的错误:无法执行 JDBC 语句 select a, 乙, rank() over (按 b 的顺序分区) 作为 rank1 from arm(未找到函数“rank”;SQL语句:select a, 乙, rank() over (按 b 的顺序分区) 作为 rank1 来自手臂 [90022-175])

如何在 R 的 sqldf 包中使用 rank() over sql 函数?

【问题讨论】:

  • 投反对票似乎有点苛刻。该问题概述了使用的包、使用的数据、使用的代码和错误消息。考虑到这里被赞成的一些废话,它显示了解释这个问题的努力。
  • rsqldf 默认使用 sqlite,它没有 rank() 函数。我对 RH2 不熟悉,但似乎 ti 也有同样的问题。您可以按照示例 from here 尝试 postgresql
  • 我不明白这个问题。这是错误报告吗?如果是这样,请报告GH。或者您正在寻找通用解决方案?在这种情况下,这个错误应该只是为了显示您最初的努力,因此您可以使用其他一些替代方法,例如arm$rank1 &lt;- unlist(with(arm, tapply(b, a, rank)))
  • @DavidArenburg - unlist(tapply(...)) 最好替换为 ave,因此它不依赖于数据集的顺序。
  • @thelatemail 是的,你说得有道理

标签: sql r syntax sqldf


【解决方案1】:

sqldf 使用的 SQLite 不支持 rank() 函数 - see here。从您从 H2 收到的错误消息中,它也不是,虽然它是 currently planned

sqldf 能够使用 PostgreSQL 而不是 SQLite,后者确实支持 rank():例如,see here。您发布的代码应该可以工作。

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

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

但是排名栏比较难——看一些相关的答案:1,2,3

由于您已经在 R 中,您可以使用原生 R 包dplyr

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

或者data.table,一个更快的选择:

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

【讨论】:

  • 请注意,如果你真的想使用 SQLite 那么:a1 &lt;- sqldf("select a, b from arm order by a, b"); min_rowid &lt;- sqldf("select x.*, min(y.rowid) min_rowid from a1 x left join a1 y using(a) group by x.a"); sqldf("select a1.*, a1.rowid - min_rowid + 1 rank from a1 join min_rowid using(a)")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2021-12-06
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
相关资源
最近更新 更多