从cos上看到一个很好玩的包:sqldf,可以把一个或多个dataframe组成数据库,然后用SQL语句来查询,这样对于一些查询计算会非常方便。其原理是先把dataframe转成SQLite的表,然后进行查询。
由于今天早上起来r-project主站无法连上,只能用镜像网站下载安装了:install.packages(“sqldf”, repos=”http://mirrors.geoexpat.com/cran/”)
使用,假设工作区里有两个dataframe:x和y,那么可以用如下方式查询
sqldf(’select * from x limit 10′)
sqldf(’select distinct id from y where status=”P” limit 10′)
sqldf(’select status, count(1) from y group by status’)
sqldf(’select y.name from x, y where x.id=1 and y.rid=x.id’)
是不是很像数据库查询,这时你的工作区就是一个数据库了。
注意:有时候表实际的列名会与dataframe的名字不一致,也即x[1:5, ]和sqldf(’select * from x limit 5′)看到的字段名是有可能会不一样的,这种情况下,以后者为准。比如我x中有一个字段user到了sqldf就变成了user__1,这时只能用user__1来作为字段名进行查询,不能再用user。最好先用sqldf(’select * from x limit 5′)确认一下具体的字段名称。
速度如何?经我的试验,10万的数据都是瞬间完成,在100万的量级都还是很快的,无论对哪个字段作为查询条件都很快,估计不是因为有索引,而是采用高效的向量化运算,并且数据都在内存里的缘故。因为即使不用sqldf,直接对data.frame作判断查询,速度也不慢,而sqldf不过作了一个漂亮的sql包装。对于更大的数据集,要考虑到内存的占用。所以如果有一个或几个可以载入到内存的数据集(又或是一些临时的结果),想做一些简单的查询计算,用sqldf就可以很快地得到结果(而且语法很简洁)。当然前提是你必须得懂简单的SQL。
不足之处在于需要依赖tcltk,这是个图形相关的包,所以在非图形界面的服务器上不会被编译安装。其实很让人费解为什么需要依赖图形包。
更新:今天收到益辉同学发来R-dev邮件组的一篇讨论帖,说sqldf并非直接依赖tcltk,而是为了加快查询而依赖gsubfn,而gsubfn依赖tcltk的缘故。我查了一下这两个包的说明,确实如此。事实上,gsubfn并非一定得依赖tcltk,后者只是起一个加速的作用,所以开发者们也在考虑是否应该把gsubfn对tcltk的depend关系改为suggest关系。我很支持,因为我在gentoo服务器上装的R是不带X进行编译的,所以不能安装tcltk。
reference:http://www.wentrue.net/blog/?p=453
没有评论:
发表评论