12.4 读取二进制文件
很多软件都把它们的数据存储为二进制格式(有一些是专有的,有一些则符合公开定义的标准)。二进制格式通常要比它们的文本格式要小,因此使用二进制格式的性能可能会更好,不过这是以可读性为代价的。
许多二进制文件的格式都是专有的,这违背了自由软件的原则。如果你可以选择,最好不要使用这种格式,以免数据被锁定在一个你缺乏控制权的平台上。
12.4.1 读取Excel文件
Microsoft Excel是目前世界上最流行的电子表格程序,也很可能是世界上最流行的数据分析工具。可惜,它的文档格式XLS和XLSX与其他软件的兼容性不好,尤其是对于那些非Windows平台的软件。这意味着,你需要做一些试验才能找到合适的配置,使你所选择的操作系统能与Excel文件兼容。
xlsx
是基于Java的跨平台包,这就是说,至少在理论上,它可以在任何系统上读取任何Excel文件。它提供了读取Excel文件的函数:使用read.xlsx
和read.xlsx2
导入电子表格,它们分别在R和Java中做了更多的处理工作。有两种选择其实很多余,你当然会选择read.xlsx2
,因为它的速度更快且底层的Java库也比R程序更加成熟。
下例显示了环法自行车赛拉普德兹山地段的最佳成绩,以及每个赛车手是否因服用禁药而被判有罪的记录。colClasses
参数将决定数据框中每列的类型。这并非是强制的,但这样做可以免去日后再处理数据的麻烦:
library(xlsx)
bike_file <- system.file(
"extdata",
"Alpe d'Huez.xls",
package = "learningr"
)
bike_data <- read.xlsx2(
bike_file,
sheetIndex = 1,
startRow = 2,
endRow = 38,
colIndex = 2:8,
colClasses = c(
"character", "numeric", "character", "integer",
"character", "character", "character"
)
)
head(bike_data)
## Time NumericTime Name Year Nationality DrugUse
## 1 37' 35" 37.58 Marco Pantani 1997 Italy Y
## 2 37' 36" 37.60 Lance Armstrong 2004 United States Y
## 3 38' 00" 38.00 Marco Pantani 1994 Italy Y
## 4 38' 01" 38.02 Lance Armstrong 2001 United States Y
## 5 38' 04" 38.07 Marco Pantani 1995 Italy Y
## 6 38' 23" 38.38 Jan Ullrich 1997 Germany Y
## Allegations
## 1 Alleged drug use during 1997 due to high haematocrit levels.
## 2 2004 Tour de France title stripped by USADA in 2012.
## 3 Alleged drug use during 1994 due to high haematocrit levels.
## 4 2001 Tour de France title stripped by USADA in 2012.
## 5 Alleged drug use during 1995 due to high haematocrit levels.
## 6 Found guilty of a doping offense by the CAS.
xlsReadWrite
是xlsx
包的另一个选择,但它现在只适用于Windows下的32位R系统。还有一些其他的包能与Excel
一起工作。例如,RExcel
和excel.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
包中的readMat
和writeMat
分别读写。
12.4.3 读取其他文件类型
R可读取多种其他类型的文件数据。
它可以使用h5r
包(以及在Bioconductor中的rdhf5
包)读取分层数据格式V5 [HDF5]文件,亦可使用ncdf
包读取网络通用数据格式[NetCDF]。
它可以使用maptools
和shapefiles
包读取ESRI公司的ArcGIS空间数据文件(以及使用RArcInfo
包读取老版本的ArcInfo文件)。
它可以通过jpeg
、png
、tiff
、rtiff
和readbitmap
包读取光栅图像格式。
它可以使用Bioconductor中的包来读取各种基因组数据格式。其中最值得注意的是,它可以通过RPPanalyzer
包读取GenePix GPR文件(也称为轴突文本文件);通过vcf2geno
包读取基因序列变异的VCF(Variant Call Format);通过rbamtools
(它提供了一个SAMtools的接口)读取二进制序列比对数据;通过lxb
包读取Luminex bead array assay文件。
最后,还有很多各式各样的格式散布于其他包中。不完全名单包括:用于MRI图像的4dfp
和tractor.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在广泛的领域中有众多的专门应用——这一点是相当震撼的。