我有一个包含库存数据的数据框(日期,符号,高,低,开,关,体积)。使用r和mysql以及sqldf和rmysql我有一个唯一日期和唯一股票代码的列表。 我现在需要的是遍历数据并在两个指定日期找到关闭。例如:
stkData
包含(日期,符号,高,低,开,结,音量)dates
包含唯一日期symbol
包含唯一符号我想循环遍历sqldf语句中的列表:
'select stkData$close from stkData where symbol = symbol[k] and date = dates[j]'
k
和j
将是循环数字,但我的问题是symbol[k]
和dates[j]
部分。
sqldf将无法正确读取它们(或者我无法正确编码)。我试过as.Date
,as.character
没有运气。我收到以下错误消息:
Error in sqliteExecStatement(con, statement, bind.data) :
RS-DBI driver: (error in statement: near "[4,]": syntax error)
答案 0 :(得分:2)
不幸的是,你在sqldf的语法方面相当遥远。您不能在sqldf调用中使用$
或[]
符号,因为它们都是R语法,而不是SQL语法。这是一种完全独立的语言。发生的事情是sqldf正在获取您的数据框,将其导入SQLite3,执行您对结果表提供的SQL查询,然后将结果集作为数据框导回到R. SQL中没有可用的R功能。
我不清楚你要做什么,但是如果你想在循环中运行多个查询,你可能想要使用R函数paste()
将SQL查询构造为一个字符串,所以当它到达SQLite3时,它只是您当前拥有symbol[k]
和dates[j]
的静态值。
因此,您将拥有类似以下内容的内容,但包含在j
和k
的循环中:
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)
前缀sqldf
与fn$
如图所示,然后反引号中的字符串将被替换为在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