【问题标题】:using dplyr window function lag (SQL database)使用 dplyr 窗口函数滞后(SQL 数据库)
【发布时间】:2015-02-16 20:36:55
【问题描述】:

在带有天气信息(列:DATE、DOY、TEMPERATURE)的 SQLite 数据库上,我喜欢添加一个带有 温度总和的新列(每天 TEMPERATURE 从 1 月 1 日到当天)。 (DOY 是一年中的某一天。)

dplyr windows 函数应该适合解决这个问题http://cran.r-project.org/web/packages/dplyr/vignettes/window-functions.html。也许像

mutate(TEMPERATURESUM = lag(TEMPERATURE, DOY, order_by=DATE))

但它给出了error in statement: no such function: LAG

你知道一个例子,我可以从中看出我是如何正确地做的吗?我不喜欢在 dplyr 有如此舒适的方式时使用纯 SQL。

谢谢 克里斯托夫

【问题讨论】:

  • 使用mtcars %>% mutate(lagged = lag(mpg, 1, order_by=carb)) 的简单测试似乎有效。您将什么类型的对象传送到mutate?你用的是什么 dplyr 版本?
  • 您能否提供一个可重现的示例,包括数据集?无论如何,从数据集中听起来您将lag 拼错为LAG
  • 您是否正在寻找从 1 月 1 日到当天的温度累计值?
  • @MrFlick 对象是 SQLite 数据库,@David lag 在 SQL 中转换为 LAG(SQL 不区分大小写),并且 SQL 中不存在 LAG :( @docendo thx for the tipp,但不幸的是我得到了与cumsum相同的错误,因为它似乎没有被翻译成等效的SQL
  • 你反对用你自己的 SQL 代码来做这件事吗?关于 sqlite 的累积总和有一些 SO 答案,似乎很简单,例如this recent one.

标签: sql r sqlite lag dplyr


【解决方案1】:

如果您不反对使用原始 SQL 代码,您可以使用library(rsqlite)

# SQL statements we want to run
sql1 <- "
ALTER TABLE t
ADD COLUMN tempsum real;"

sql2 <- "
UPDATE t
SET tempsum = (SELECT Sum(t2.temperature) 
               FROM t as t2 WHERE t2.doy <= t.doy);" 

dbSendQuery(conn, sql1)
dbSendQuery(conn, sql2)

这是改编自 SO question 关于 SQLite 中的累积和的 example showing it works on SQL Fiddle(我了解到 here)。

但是我想你也可以只计算 R 中的累积总和并将结果写回 SQLite,如果表不是太大,所以我不确定你的问题是否专门关于如何使用dplyr,或者一般怎么做。

【讨论】:

  • 非常感谢您提供的示例。我可能会那样做。 dplyr目前可能无法以更简单的方式即时
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多