12.4 读取二进制文件

很多软件都把它们的数据存储为二进制格式(有一些是专有的,有一些则符合公开定义的标准)。二进制格式通常要比它们的文本格式要小,因此使用二进制格式的性能可能会更好,不过这是以可读性为代价的。

许多二进制文件的格式都是专有的,这违背了自由软件的原则。如果你可以选择,最好不要使用这种格式,以免数据被锁定在一个你缺乏控制权的平台上。

12.4.1 读取Excel文件

Microsoft Excel是目前世界上最流行的电子表格程序,也很可能是世界上最流行的数据分析工具。可惜,它的文档格式XLS和XLSX与其他软件的兼容性不好,尤其是对于那些非Windows平台的软件。这意味着,你需要做一些试验才能找到合适的配置,使你所选择的操作系统能与Excel文件兼容。

xlsx是基于Java的跨平台包,这就是说,至少在理论上,它可以在任何系统上读取任何Excel文件。它提供了读取Excel文件的函数:使用read.xlsxread.xlsx2导入电子表格,它们分别在R和Java中做了更多的处理工作。有两种选择其实很多余,你当然会选择read.xlsx2,因为它的速度更快且底层的Java库也比R程序更加成熟。

下例显示了环法自行车赛拉普德兹山地段的最佳成绩,以及每个赛车手是否因服用禁药而被判有罪的记录。colClasses参数将决定数据框中每列的类型。这并非是强制的,但这样做可以免去日后再处理数据的麻烦:

  1. library(xlsx)
  2. bike_file <- system.file(
  3. "extdata",
  4. "Alpe d'Huez.xls",
  5. package = "learningr"
  6. )
  7. bike_data <- read.xlsx2(
  8. bike_file,
  9. sheetIndex = 1,
  10. startRow = 2,
  11. endRow = 38,
  12. colIndex = 2:8,
  13. colClasses = c(
  14. "character", "numeric", "character", "integer",
  15. "character", "character", "character"
  16. )
  17. )
  18. head(bike_data)
  19. ## Time NumericTime Name Year Nationality DrugUse
  20. ## 1 37' 35" 37.58 Marco Pantani 1997 Italy Y
  21. ## 2 37' 36" 37.60 Lance Armstrong 2004 United States Y
  22. ## 3 38' 00" 38.00 Marco Pantani 1994 Italy Y
  23. ## 4 38' 01" 38.02 Lance Armstrong 2001 United States Y
  24. ## 5 38' 04" 38.07 Marco Pantani 1995 Italy Y
  25. ## 6 38' 23" 38.38 Jan Ullrich 1997 Germany Y
  26. ## Allegations
  27. ## 1 Alleged drug use during 1997 due to high haematocrit levels.
  28. ## 2 2004 Tour de France title stripped by USADA in 2012.
  29. ## 3 Alleged drug use during 1994 due to high haematocrit levels.
  30. ## 4 2001 Tour de France title stripped by USADA in 2012.
  31. ## 5 Alleged drug use during 1995 due to high haematocrit levels.
  32. ## 6 Found guilty of a doping offense by the CAS.

xlsReadWritexlsx包的另一个选择,但它现在只适用于Windows下的32位R系统。还有一些其他的包能与Excel一起工作。例如,RExcelexcel.link使用COM连接从R中控制Excel,WriteXLS使用Perl写入Excel文件。gnumeric包提供了读取Gnumeric电子表格的函数。

read.xlsx2相对应的函数是(你猜对了)write.xlsx2。它的工作方式与write.csv相同,它的参数为一个数据框和文件名。除非你真的需要使用Excel电子表格,否则为了方便,你最好还是把数据保存为文本格式。所以请小心使用。

12.4.2 读取SAS、Stata、SPSS和MATLAB文件

如果你正在与其他组织的统计人员合作,他们可能会向你发送一些从其他统计包中生成的文件。foreign包中包含了使用read.ssd读取SAS永久数据集2(SAS7BDAT文件)、使用read.dta读取Stata的DTA文件、使用read.spss读取SPSS数据文件的方法等。这些文件都可使用write.foreign写入文件。

2目前还不能把老的SAS SD2文件导入到R。处理这种格式的最简方法就是用免费的SAS通用浏览器(http://bit.ly/ldqSmrB)打开它,并重新保存为CSV。

MATLAB的二进制数据文件(4级及5级)可以使用R.matlab包中的readMatwriteMat分别读写。

12.4.3 读取其他文件类型

R可读取多种其他类型的文件数据。

它可以使用h5r包(以及在Bioconductor中的rdhf5包)读取分层数据格式V5 [HDF5]文件,亦可使用ncdf包读取网络通用数据格式[NetCDF]。

它可以使用maptoolsshapefiles包读取ESRI公司的ArcGIS空间数据文件(以及使用RArcInfo包读取老版本的ArcInfo文件)。

它可以通过jpegpngtiffrtiffreadbitmap包读取光栅图像格式。

它可以使用Bioconductor中的包来读取各种基因组数据格式。其中最值得注意的是,它可以通过RPPanalyzer包读取GenePix GPR文件(也称为轴突文本文件);通过vcf2geno包读取基因序列变异的VCF(Variant Call Format);通过rbamtools(它提供了一个SAMtools的接口)读取二进制序列比对数据;通过lxb包读取Luminex bead array assay文件。

最后,还有很多各式各样的格式散布于其他包中。不完全名单包括:用于MRI图像的4dfptractor.base包,用于WaveMetrics Igor二进制格式文件的IgorR包,用于GENEActiv观看加速度计数据显示的GENEAread包,用于INRO软件EMME v2数据库文件的emme2包,用于SEER癌症数据集(http://seer.cancer.gov/seerstat)的SEER2R包,用于Google Protocol Buffer(http://code.google.com/p/protobuf)的rprotobuf包,用于Bruker flex格式(http://strimmerlab.org/software/maldiquant/)中质谱数据的readBrukerFlexData包,用于在Models-3文件中社区多尺度空气质量模式的M3包,以及用于世界生育率调查的Read.isi包。

虽然以上很多的包对于大多数人来说完全没用,但R在广泛的领域中有众多的专门应用——这一点是相当震撼的。