【问题标题】:handle dates and concatenate strings in dplyr (SQL)在 dplyr (SQL) 中处理日期和连接字符串
【发布时间】:2015-02-14 22:46:44
【问题描述】:

我有一个包含YEARDOY(一年中的一天)列的数据库。我想添加一个额外的列DATE,例如

mutate(data, DATE = date(julianday(YEAR || '-01-01'), '+'||(DOY-1)||' day')) 

但这不起作用,可能是因为SQL字符串连接“||”转换为“或”。你会怎么做?

在另一种情况下,我必须转换 SQL 日期对象中的字符串。在 R 中,我会使用 lubridateymd 在 dplyr (SQL) 中使用 mutate 是否有类似的简单方法?

克里斯托夫

【问题讨论】:

  • 试试%||% 应该转换成||

标签: sql r date dplyr


【解决方案1】:

mutate in dplyr 修改结果但不修改我收集的数据库中的表是你想要的。

该问题没有说明正在使用哪个数据库,这很重要,但在没有使用 SQLite 的情况下,下面将使用它。

1) 下面是使用 RSQLite 包更新数据库中的表 DF 并带有 DATE 列的代码。可能需要(DOY-1) 来代替DOY,具体取决于DOY 的来源(0 或1)。您可能还需要将 DOY 转换为整数,但在我的运行中,没有它也可以工作。

library(RSQLite)

# create test database with a table DF
con <- dbConnect(SQLite())
DF <- data.frame(YEAR = 2014, DOY = 15)
dbWriteTable(con, "DF", DF)

# add DATE column to table DF and update its value
dbGetQuery(con, "alter table DF add column DATE")
dbGetQuery(con, "update DF 
                 set DATE = date(cast(YEAR as integer) || '-01-01', DOY || ' days')")

给予:

dbGetQuery(con, "select * from DF")
##   YEAR DOY       DATE
## 1 2014  15 2014-01-16

2) 如果您只是想修改结果而不是数据库本身,那么假设 SQLite 再试一次:

library(dplyr)
library(RSQLite)

# create database and add table DF to it
db <- src_sqlite(path = tempfile(), create = TRUE) # test database
DF <- data.frame(YEAR = 2014, DOY = 15) # test data
dbWriteTable(db$con, "DF", DF)

db_DF <- tbl(db, "DF")
db_DF %>% 
      mutate(DATE = sql("date(cast(YEAR as integer) || '-01-01', DOY || ' days')"))

更新 (1) 使用 RSQLite 并修改数据库。 (2) 使用 dplyr 而没有。

【讨论】:

  • thx,在 data.framessqldf 上工作正常,如您的示例中那样,但不适用于 dplyr SQLiteConnection 它构造了一个类似 SELECT "DATE", AS.DATE(PASTE0("YEAR", '-01-01')) + ("DOY" - 1.0) AS "DATE" 的查询,并且 SQL 对 @ 一无所知987654335@和as.date
  • %||% 记录在 dplyr 文档中。但是 SQL date(...,...) 中的 ,​​ 似乎是一个问题(!(到 NOT),&& 和 & 到 AND,|| 和 | 到 OR,^ 到 POWER,%>% 到 % , 天花板到 CEIL, 平均值到 AVG, var 到 VARIANCE, tolower 到 LOWER, toupper 到 UPPER 和 nchar 到长度。c 和 : 保持它们通常的 R 行为,以便您可以轻松创建传递给 sql 的向量。所有其他函数将是保持原样。R 的中缀函数(例如 %like%)将被转换为它们的 sql 等价物...|| 被映射到 OR,但 %||% 被映射到 ||。)
  • @Grothendieck 也许,但如果没有必要,我不想更改数据库或将大量数据转换为 R 对象。 ;)
  • 已修改为使用 RSQLite,以便它可以在适当的位置修改数据库。
  • @Grothendieck 非常感谢您的详细帮助和描述,这对我来说是一个很好的解决方法
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多