R中的sqldf包,查询数据帧

时间:2011-11-21 22:59:12

标签: macos r sqldf

我正在尝试使用R中的sqldf库重写一些代码,这应该允许我在数据帧上运行SQL查询,但是每当我尝试运行查询时,我遇到了一个问题,R看起来像它尝试查询我使用的实际真正的MySQL数据库骗局,并通过我试图搜索的数据框的名称查找表。

当我运行时:

    sqldf("SELECT COUNT(*) from work.class_scores")

我明白了:

mysqlNewConnection(drv,...)出错:   RS-DBI驱动程序:(无法连接到数据库:错误:无法通过套接字'/tmp/mysql.sock'连接到本地MySQL服务器(2) )

当我尝试使用两种不同的方式指定位置时(第一种形式是googlecode页面,第二种形式应该基于文档)

>     sqldf("SELECT COUNT(*) from work.class_scores", sqldf.driver = "SQLite")
Error in sqldf("SELECT COUNT(*) from work.class_scores", sqldf.driver = "SQLite") : 
  unused argument(s) (sqldf.driver = "SQLite")
>     sqldf("SELECT COUNT(*) from work.class_scores", drv = "SQLite")
Loading required package: tcltk
Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared library '/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so':
  dlopen(/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so, 10): Library not loaded: /usr/local/lib/libtcl8.5.dylib
  Referenced from: /Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so
  Reason: image not found
Error: require(tcltk) is not TRUE

所以,我认为这可能是这个包tcltk的一个问题,我从来没有听说过,所以我试着照顾它并发现一些问题:

 > install.packages("tcltk")
Warning in install.packages :
  argument 'lib' is missing: using '/Users/michaeldiscenza/Library/R/2.11/library'
Warning in install.packages :
  package ‘tcltk’ is not available
> install.packages("tcltk2", lib="/Applications/RStudio.app/Contents/Resources/R/library")
trying URL 'http://lib.stat.cmu.edu/R/CRAN/bin/macosx/leopard/contrib/2.11/tcltk2_1.1-5.tgz'
Content type 'application/x-gzip' length 940835 bytes (918 Kb)
opened URL
==================================================
downloaded 918 Kb


The downloaded packages are in
    /var/folders/Y1/Y1gdz9tKFiSnWsGP9+BDcU+++TI/-Tmp-//RtmpL07KTL/downloaded_packages
> library("tcltk")
Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared library '/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so':
  dlopen(/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so, 10): Library not loaded: /usr/local/lib/libtcl8.5.dylib
  Referenced from: /Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so
  Reason: image not found
Error: package/namespace load failed for 'tcltk'

!dbPreExists中出错:参数类型无效

在这里,我真的不知道问题是什么,我需要移动一下吗?

我尝试的另一种方法是在对数据框对象运行查询之前,设置我的数据库连接,以便R看起来而不是尝试连接到实际的本地MySQL数据库。但那没用。回到套接字的问题(即使我可以查询本地数据库本身没有任何问题。

>     con <- sqldf()
Error in mysqlNewConnection(drv, ...) : 
  RS-DBI driver: (Failed to connect to database: Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
)

最后,我想查询得到C的值大于2的记录数,我觉得这样做很舒服。唯一的问题是我不知道是否有另一种方式来指定我查询的是数据帧而不是实际的数据库。我错过了一些非常愚蠢和容易的东西吗?

谢谢!

2 个答案:

答案 0 :(得分:11)

此答案已从我之前的评论中转移。

帖子和评论表明:

  1. 即使加载了RMySQL,也希望将SQLite与sqldf一起使用 和

  2. 有一条关于tcltk缺失的消息

  3. 有一个问题:sqldf("select count(*) from work.class_scores") 其中work.class_scores是数据框。

  4. 在上面的sqldf home page常见问题解答#7地址(1)和常见问题解答#5地址(2)。 (3)由于dot是一个SQL运算符,因此需要引用这些数据框名称,或者更改其名称以删除点。

    下面我们提供实现上述三种解决方案的可重复示例。

    sqldf.driver选项用于强制使用SQLite,即使加载了RMySQL也是如此。

    关于tcltk,有三种方法:(i)gsubfn.engine选项导致使用R代码代替tcltk,这样就不需要tcltk包。请参阅下面的示例代码(ii)交替安装tcltk。 (iii)当sqldf 0.4-4是当前版本时,问这个问题,但是现在sqldf 0.4-5已经注意到已经添加了额外的tcltk包检测,这使得它更有可能在没有用户的情况下自动处理所有这些设置任何选项,而无需安装tcltk。因此,最简单的解决方案可能是升级到sqldf 0.4-5或更高版本。

    我们引用其中包含点的数据框名称或将数据框名称替换为不包含点的名称:

    options(sqldf.driver = "SQLite") # as per FAQ #7 force SQLite
    options(gsubfn.engine = "R") # as per FAQ #5 use R code rather than tcltk
    
    library(RMySQL)
    library(sqldf)
    
    work.class_scores <- BOD # BOD is built in
    sqldf("select count(*) from 'work.class_scores'")
    
    # or
    work_class_scores <- work.class_scores
    sqldf("select count(*) from work_class_scores")
    

    编辑:

    添加了有关sqldf 0.4-5的信息。

答案 1 :(得分:3)

您可以尝试从here安装tcl套餐吗? (假设你在Mac上)。