在sqldf中匹配日期

时间:2011-08-22 18:52:09

标签: r

我有一个包含库存数据的数据框(日期,符号,高,低,开,关,体积)。使用和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)

3 个答案:

答案 0 :(得分:2)

不幸的是,你在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 :(得分:0)

在将select语句传递给SQL调用方之前,您可能需要将select语句构造为带有粘贴的字符串。类似的东西:

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="")

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

答案 2 :(得分:0)

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

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