2014年7月9日 星期三

[R] 以不變應萬變-SQL in R


        只要有用到資料庫,那一定會學到SQL(Structured Query Language-結構化查詢語言)的語法,SPSS和SAS也有類似的語法或套件,SAS EG更是大量使用SQL的語法。雖然版本很多,但是SQL的語法大同小異,在剛使用R的時候,由於對其他的指令還不熟悉,馬上就搜尋有無SQL的套件可以使用--有的,叫做SQLdf(http://cran.r-project.org/web/packages/sqldf/index.html)




        SQLdf套件採用的是SQLite(http://www.sqlite.org/index.html),支援標準的SQL語法,也有包含常用的aggregate指令,對於熟悉SQL語法結構的人來說相當的方便。

        SQL最基本的語句是SELECT:程式流程如下(來源:http://www.codedata.com.tw/database/mysql-tutorial-basic-query/)
        在R裡面長得像這個樣子

        使用時呼叫sqldf物件,SQL指令要用" "雙引號夾住,就能將SQL的查詢結果存到x裡面,查詢的結果是個data.frame物件。

        sqldf除了簡單的查詢與聚合指令外,也支援複雜的指令(包括子查詢與條件句):


由於sqldf用雙引號夾住sql指令,因此sql指令中間沒辦法在接受以"#"為開頭的註解,這點使用上必須注意。

另外需要注意的是,有時用我們在r裡面的變項名稱會用a.column1的方式來命名,但是這樣的變項名稱若在sqldf指令中使用時,會與原本sql內建的" . "混淆(sql中"a.b"的意思代表來自a表格中的b欄),在欄位命名上需要注意這點。

圖片來源:http://digijustin.com/2007/03/23/selecting-random-row-from-a-sql-select-statement/