2011-08-22 67 views
1

我有一个股票数据(日期,符号,高,低,开,关,量)的数据框。使用和mysql和sqldf和rmysql我有一个唯一的日期和独特的股票符号的列表。 我现在需要的是循环访问数据并在两个指定的日期找到关闭。例如:在sqldf的匹配日期

  • 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) 
+1

我觉得你很混淆SQL语法和R语法。 – James

+0

sqldf主页上的示例5 https://github.com/ggrothendieck/sqldf显示如何使用fn $ facility将变量插入到sql字符串中。 –

回答

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])) 
+0

非常感谢你! (一些调整:1)我不得不使用“而不是”和2)我不得不在最后抛出一个'seq ='“'来摆脱引号内的额外空格。)再次非常感谢它救了我一大堆沮丧! – acesnap

+0

乐意提供帮助,您可以点击左边的复选标记来接受我的回答,因此问题不会显示为仍然处于打开状态吗?谢谢! – goodside

0

您可能需要构建select语句与粘贴字符串,然后才会慢慢传递到你的SQL调用者。例如:

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调用。

+0

我以前从未使用过此方法。你可以循环使用SQL调用吗?谢谢你的方式。 – acesnap

+0

SQL调用只是一个字符向量;和paste()的结果是一样的,所以:res < - list(); for(idx in seq_along(SQLcalls)){ res [idx] < - sqldf(SQLcalls [idx])} –

0

前言sqldffn$如图然后反向引号内的字符串将通过在R和形式$变量的串运行它们将由变量(提供的变量名中的内容被替换的结果被替换仅包含字字符)。需要注意的是SQL需要加上引号字符常量,所以一定要围绕反引号或$变量加上引号:

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

使用$变量语法试试这个:

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

请参考例子5在sqldf github页面上:https://github.com/ggrothendieck/sqldf