2011-08-22 73 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