4.11 使用SQL语句操作数据框

到目前为止,你一直在使用R语句操作数据。但是,许多数据分析人员在接触R之前就已经精通了结构化查询语言(SQL),要丢弃那么多积累下来的知识实为一件憾事。因此,在我们结束本章之前简述一下sqldf包。(如果你对SQL不熟,请尽管跳过本节。)

在下载并安装好这个包以后(install.packages("sqldf")),你可以使用sqldf()函数在数据框上使用SQL中的SELECT语句。代码清单4-7给出了两个示例。

代码清单4-7 使用SQL语句操作数据框

  1. > library(sqldf)
  2. > newdf <- sqldf("select * from mtcars where carb=1 order by mpg",
  3. row.names=TRUE)
  4. > newdf
  5. mpg cyl disp hp drat wt qsec vs am gear carb
  6. Valiant 18.1 6 225.0 105 2.76 3.46 20.2 1 0 3 1
  7. Hornet 4 Drive 21.4 6 258.0 110 3.08 3.21 19.4 1 0 3 1
  8. Toyota Corona 21.5 4 120.1 97 3.70 2.46 20.0 1 0 3 1
  9. Datsun 710 22.8 4 108.0 93 3.85 2.32 18.6 1 1 4 1
  10. Fiat X1-9 27.3 4 79.0 66 4.08 1.94 18.9 1 1 4 1
  11. Fiat 128 32.4 4 78.7 66 4.08 2.20 19.5 1 1 4 1
  12. Toyota Corolla 33.9 4 71.1 65 4.22 1.83 19.9 1 1 4 1
  13. > sqldf("select avg(mpg) as avg_mpg, avg(disp) as avg_disp, gear
  14. from mtcars where cyl in (4, 6) group by gear")
  15. avg_mpg avg_disp gear
  16. 1 20.3 201 3
  17. 2 24.5 123 4
  18. 3 25.4 120 5

第一个示例中,你从数据框mtcars中选择了所有的变量(列),保留了那些使用化油器(carb)的车型(行),按照mpg对车型进行了升序排序,并将结果保存为数据框newdf。参数row.names=TRUE将原始数据框中的行名延续到了新数据框中。在第二个示例中,你输出了四缸和六缸车型每一gear水平的mpgdisp的平均值。

经验丰富的SQL用户将会发现,sqldf包是R中一个实用的数据管理辅助工具。请参阅项目主页(http://code.google.com/p/sqldf/)以了解详情。