在dplyr中处理日期和连接字符串(SQL)

时间:2014-12-16 15:13:19

标签: sql r date dplyr

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

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

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

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

克里斯托夫

1 个答案:

答案 0 :(得分:4)

dplyr中的

mutate会修改结果,但不会修改我收集的数据库中的表格。

问题没有说明正在使用哪个数据库,这很重要,但如果没有使用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而不是。