gpt4 book ai didi

r - 在 R 中围绕多个 SQL 查询包装一个函数?

转载 作者:行者123 更新时间:2023-12-04 10:58:30 25 4
gpt4 key购买 nike

我有一些 SQL 查询基本上按时间解析数据集(POSIXct 日期格式):

library(sqldf)
data_2013 <- sqldf("SELECT * FROM data WHERE strftime('%Y-%m-%d', time,
'unixepoch', 'localtime') >= '2013-01-01' AND strftime('%Y-%m-%d', time,
'unixepoch', 'localtime') <= '2013-12-31'")

data_2012 <- sqldf("SELECT * FROM data WHERE strftime('%Y-%m-%d', time,
'unixepoch', 'localtime') >= '2012-01-01' AND strftime('%Y-%m-%d', time,
'unixepoch', 'localtime') <= '2012-12-31'")

data_2011 <- sqldf("SELECT * FROM data WHERE strftime('%Y-%m-%d', time,
'unixepoch', 'localtime') >= '2011-01-01' AND strftime('%Y-%m-%d', time,
'unixepoch', 'localtime') <= '2011-12-31'")

但是,这段代码对我来说似乎很笨拙。有没有一种巧妙的方法可以将其包装成一个函数或其他一些使其更短的方法,同时仍然吐出相同的 3 个独立数据集?

最佳答案

between and fn$ 使用 between 并通过在 sqldf 前面加上 分解出 strptime 表达式fn 执行字符串插值:

Time <- "strftime('%Y-%m-%d', time, 'unixepoch', 'localtime')"
st <- '2013-01-01'
en <- '2013-12-31'
fn$sqldf("select * from data where $Time between '$st' AND '$en' ")

如果需要,这可以像其他解决方案一样很容易地变成一个函数。

如果是年,可以这样简化:

Year <- "strftime('%Y', time, 'unixepoch', 'localtime')"
yr <- '2013'
sql <- "select * from data where $Year = '$yr' "
fn$sqldf(sql)

我们可以像这样创建一个数据框列表:

Map(function(yr) fn$sqldf(sql), as.character(2011:2013))

R/sqldf 另一种可能是先在R中添加字符列:

data$Year <- format(data$time, "%Y")
yr <- '2013'
sql <- "select * from data where Year = '$yr' "
fn$sqldf(sql)

R 请注意,直接在 R 中执行此操作并不难:

yr <- "2013"
subset(data, format(time, "%Y") == yr)

还要将其拆分为数据框列表,每年一个:

split(data, format(data$time, "%Y"))

H2 sqldf 还可以与某些其他数据库一起使用。 SQLite 的问题是它没有日期/时间类型,但是 H2 数据库直接支持日期/时间作为一种类型,因此它大大简化了。如果 sqldf 发现 RH2 已加载,它将使用它而不是 SQLite:

library(RH2)
library(sqldf)
yr <- 2013
sql <- "select * from data where year(time) = $yr"
fn$sqldf(sql)

关于r - 在 R 中围绕多个 SQL 查询包装一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19636760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com