【问题标题】:Matching dates in sqldfsqldf 中的匹配日期
【发布时间】:2011-11-01 09:36:55
【问题描述】:

我有一个包含股票数据(日期、代码、最高价、最低价、开盘价、收盘价、成交量)的数据框。使用 和 mysql 以及 sqldf 和 rmysql 我有一个唯一日期和唯一股票代码的列表。 我现在需要的是遍历数据并找到两个指定日期的收盘价。例如:

  • stkData 包含(日期、符号、最高价、最低价、开盘价、收盘价、成交量)
  • dates 包含唯一日期
  • symbol 包含独特的符号

我想像这样遍历 sqldf 语句中的列表:

'select stkData$close from stkData where symbol = symbol[k] and date = dates[j]'

kj 将是循环数字,但我的问题是 symbol[k]dates[j] 部分。
sqldf 无法正确读取它们(或者我无法正确编码)。我试过as.Dateas.character 没有运气。我收到以下错误消息:

Error in sqliteExecStatement(con, statement, bind.data) : 
RS-DBI driver: (error in statement: near "[4,]": syntax error)

【问题讨论】:

  • 我认为你混淆了 SQL 语法和 R 语法。
  • sqldf 主页github.com/ggrothendieck/sqldf 上的示例 5 展示了如何使用 fn$ 工具将变量插入到 sql 字符串中。

标签: r r


【解决方案1】:

不幸的是,您在 sqldf 的语法方面还差得很远。您不能在 sqldf 调用中使用 $[] 表示法,因为它们都是 R 语法,而不是 SQL 语法。它是一种完全独立的语言。正在发生的事情是 sqldf 正在获取您的数据框,将其导入 SQLite3,执行您针对结果表提供的 SQL 查询,然后将结果集作为数据框导入回 R。 SQL 中没有可用的 R 功能。

我不清楚你要做什么,但如果你想在一个循环中运行多个查询,你可能想使用 R 函数paste() 将 SQL 查询构造为字符串,这样当它到达 SQLite3,它只是静态值,您当前拥有 symbol[k]dates[j]

因此,您将获得类似以下内容,但将其包装在 jk 的循环中:

sqldf(paste('select close from stkData where symbol = ', symbol[k],
            ' and date = ', dates[j]))

【讨论】:

  • 非常感谢! (一些调整:1)我必须使用 " 而不是 ' 和 2) 我必须在最后抛出一个 'seq=""' 以消除引号内的额外间距。)再次非常感谢它救了我很多挫败感!
  • 乐于助人。您能否单击左侧的复选标记以接受我的答案,这样问题就不会显示为仍处于打开状态?谢谢!
【解决方案2】:

在将 select 语句传递给 SQL 调用者之前,您可能需要使用 paste 将其构造为字符串。比如:

combo_kj <- expand.grid(ksym=symbol[1:k], jdates=dates[1:j])

SQLcalls <- paste('select close from stkData where symbol = ',
                   combo_kj$ksym,
                   ' and date = '
                   combo_kj$jdates,
                   sep="")

然后使用您正在使用的任何代码循环 SQL 调用。

【讨论】:

  • 我以前从未使用过这种方法。你将如何循环 SQL 调用?顺便谢谢你。
  • SQLcalls 只是一个字符向量;与 paste() 的结果类型相同。所以: res
【解决方案3】:

前言 sqldffn$ 如图所示,然后反引号中的字符串将被在 R 中运行它们的结果替换,并且 $variable 形式的字符串将被该变量的内容替换(提供变量名仅包含单词字符)。请注意,SQL 要求将字符常量放在引号中,因此请务必将反引号或 $variable 用引号括起来:

fn$sqldf("select close from stkData 
   where symbol = '`symbol[k]`' and 
         date = '`dates[j]`' ")

要使用 $variable 语法,试试这个:

mysymbol <- symbol[k]
mydate <- dates[j]
fn$sqldf("select close from stkData 
   where symbol = '$mysymbol' and 
         date = '$mydate' ")

另见 sqldf github 页面上的示例 5:https://github.com/ggrothendieck/sqldf

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多