收藏 分享(赏)

R 数据的导入和导出.doc

上传人:精品资料 文档编号:10963090 上传时间:2020-01-28 格式:DOC 页数:42 大小:70.08KB
下载 相关 举报
R 数据的导入和导出.doc_第1页
第1页 / 共42页
R 数据的导入和导出.doc_第2页
第2页 / 共42页
R 数据的导入和导出.doc_第3页
第3页 / 共42页
R 数据的导入和导出.doc_第4页
第4页 / 共42页
R 数据的导入和导出.doc_第5页
第5页 / 共42页
点击查看更多>>
资源描述

1、R 数据的导入和导出译者前言不能期望一个软件可以做所有的事情 1。R 也不例外。因此, R 需要和其它东西协作。包括我们人类,需要我们输入数据,导出数据。包括我们的其它软件,Excel,SPSS,等等,数据格式都是特异的,需要 R 特别处理。包括我们的数据库系统,R 不是用来管理数据的,所以需要专业的数据库帮忙。也包括不同机器间,上面编译的 R 也是需要交换数据。这一册文档就是描述这些事情的。R 的主要目的就是分析数据。虽然,你可以用它来处理文档,画个奥运会的鸟巢,R 的主要目的还是数据分析。这是专业化个性化的时代,特色取胜。这个文档在几年前就写了一些。很实用的一个文档。开发人员可以大致了解

2、R 和其它软件大致的通讯情况,非开发人员至少可以了解, R 通过包能直接读取Excel 表格。已经是凌晨了,不多写了。任何问题和建议可以给 Email!感谢身边的朋友!丁国徽Email: 2008 年 1 月 6 日Previous: Words from the Translator, Up: Notes致谢手册中关系数据库的内容部分基于 Douglas Bates 和 Saikat DebRoy 早期写的一个手册。本手册主要由 Brian Ripley 编写。这里用到很多扩展包都是由自愿者贡献。这里提到的包以及主要作者如下,CORBA Duncan Temple Langforeign T

3、homas Lumley, Saikat DebRoy, Douglas Bates, Duncan Murdoch and Roger Bivandhdf5 Marcus Danielsncdf David Piercencvar Juerg SchmidlirJava Simon UrbanekRMySQL David James and Saikat DebRoyRNetCDF Pavel MichnaRODBC Michael Lapsley and Brian RipleyRSPerl Duncan Temple LangRSPython Duncan Temple LangSJav

4、a John Chambers and Duncan Temple LangXML Duncan Temple Lang1.1 Imports 导入导入 R 的数据中最容易的格式是简单的文本文件。对于小型或中型的问题,这种格式都可以接受的。从文本文件导入数据的原始函数(primary function)是 scan。电子表格类似数据( Spreadsheet-like data)一章中讨论的大多数比较便利的函数都是基于这个原始函数。但是,所有的统计顾问们对客户用软盘或光盘提交一些私有的二进制数据(比如,Excel 电子表格或SPSS 文件 )都比较熟悉。通常,可以做的最简单的事情是用原始软件把

5、数据用文本文件导出(而统计顾问们为了这个目的会在他们电脑里面安装大多数常用的软件)。不过,这不会总是可能的 2。在从其它统计软件中导入数据( Importing from other statistical systems)一章中,我们会讨论一些可以在 R 里面直接读取这些文件的工具。对 Excel 电子表格,读取 Excel电子表格( Reading Excel spreadsheets)一章对可以获得的相关方法进行了总结。在很少的一些例子中,出于简洁和快速访问考虑,数据以二进制格式保存。这种情况下一个例子是我们已经见过几次的图像数据。它通常以二进制流的方式保存然后在内存里面呈现,而且可能在

6、数据前面加个信息头。这种数据格式在二进制文件( Binary files)和二进制连接( Binary connections)部分都有所讨论。对于大的数据库数据,通常要借助数据库管理系统(Database management system,DBMS)来处理。我们可以通过 DBMS 从数据库里面提取没有格式的文本文件,但是对于大多数这一类型的 DBMS,我们可以直接通过 R 的包来实现数据提取操作:见关系数据库( Relational databases)部分。通过网络连接来导入数据在网络接口( Network interfaces)一章讨论。Next: XML, Previous: Imp

7、orts, Up: Introduction1.2 导出到文本文件中从 R 里面导出结果通常是一个很少争论的事情,但是实际操作中仍然有一些问题。在知道目标应用软件前提下,通常把文本文件作为最为便利的中间转换工具。(如果需要二进制文件,见二进制文件( Binary files)一章)。函数 cat 是导出数据的函数的基础。它有一个 file参数和 append。通过连续地调用 cat 对一个文本文件写入。最好的方式是,特别需要多次这样做的时候,首先为写入或添加文本打开一个 file 连接,然后用 cat连接,最后关掉(close )它。最常见的工作是把一个矩阵或数据框以数字的矩形网格方式写入文件

8、中,而且还可能保留行列的标签。这可以通过函数 write.table 和 write 来完成。函数 write仅可以写出一个矩阵或向量的特定列(和对一个矩阵进行转置)。函数 write.table 更为便利,它可把一个数据框(或一个可以强制转换为数据框的对象)以包含行列标签的方式写出。在把一个数据框写入到一个文本文件中时,有许多问题需要考虑。. 精度问题 大多数通过这些函数对实/复数的转换是全精度的,但是用 write时,精度由 options(digits)的当前设置确定。如果需要更多的控制,在一个数据框上逐列使用 format 。. 首行问题 R 倾向在首行不出现表示行名字的条目,因此在文

9、件里面.dist climb timeGreenmantle 2.5 650 16.083.其它一些系统需要给行名字一个条目(可能为空),此时,可以通过在write.table 中设置参数 col.names = NA 来实现。. 分隔符问题 文件中常用的字段分隔符是逗号,因为在英语语系的国家,逗号几乎不可能出现在任何字段中。这种文件被称为 CSV(逗号分隔值)文件,对应的包装函数(wrapper function) write.csv提供了适当的默认值。在一些本地系统中,逗号作为十进制位中的小数点(在 write.csv函数中设置参数 dec = “,“) 3 ,此时 CSV 文件以分号作为

10、字段分隔符: write.csv2 设置了适当的默认值。 用分号或制表符(sep = “t“)可能是一种比较安全的选择。. 缺损值问题 默认情况下,缺损值以 NA 形式输出,但这可以通过参数 na来改变。注意,NaN 在 write.table里面以 NA 看待,但在 cat 或 write里面是区别对待的。. 被引号括起的字符串 默认情况下,字符串被引号括起(包括行列的名字)。参数 quote 控制着字符和因子变量的引号引用问题。 需要注意字符串中的引号嵌套问题。三种有用的形式如下. df write.table(df)“a“1“ “a “ quote“ write.table(df, qm

11、ethod = “double“)“a“1“ “a “ quote“ write.table(df, quote = FALSE, sep = “,“)a1,a “ quote.逃逸(Escape)的第二种形式常用于电子表格中。.包 MASS 中的函数 write.matrix 为写矩阵提供了一种专用的接口。它同时提供了以区块方式写的可选项,这样可以降低内存的使用。用 sink 可能把标准 R 输出重定向到一个文件中,因此捕获了 print 语句(可能是暗含的)的输出。通常,这不是最有效的办法,options(width)设置可能需要增加。包 foreign 里面的函数 write.forei

12、gn 用 write.table 产生文本文件,同时编写一个可以让另外一个统计包读入该文本文件的代码文件。现在支持导出到 SPSS 和 Stata。Previous: Export to text files, Up: Introduction1.3 XML 文件当从一个文本文件中读取数据时,用户有责任知道并且按习惯创建文件,比如,在导出问文本文件( Export to text files)一节中提到的注释字符,是否有信息头行,分隔符,缺损值的描述方式(等等)。标签语言既可以描述内容又可以定义内容的结构,这样可以使一个文件的内容自我明了。此时,不需要为读取这些数据的软件专门提供这些细节信息。

13、可扩展标签语言(eXtensible Markup Language) 通常简化为 XML 可用于提供这样的结构,不仅能描述标准数据集也可以描述更复杂的数据结构。 XML 现在变得非常流行,并且作为常规数据标签和交换的标准。它被各种团体所采用,从地理数据(如地图),图像展示 4 到数学等。包 XML 为在 R 和 S-PLUS 读写 XML 文档提供了通用的工具。它让我们可以很容易的使用这种近年出现的技术。多位研究人员正在探索如何在其它事情中用 XML 描述在不同应用软件中共享的数据集;存储不同系统共享的 R 和 S-PLUS 对象;通过 SVG (可扩展矢量图, Scalable Vecto

14、r Graphics,XML 的一种针对矢量图应用的变种)描述图像;描述函数文档;生成“生动的”含有文本,数据和代码的分析/报告。对 XML 包里面工具的描述已经超出本文档内容范围:详细信息和例子见该包的主页(http:/www.omegahat.org/RSXML)。 CRAN 里面的包 StatDataML 是基于 XML 包的一个例子。Next: Importing from other statistical systems, Previous: Introduction, Up: Top2 电子表格类似的数据 Variations on read.table: read.table

15、的变化样式 Fixed-width-format files: 固定宽度格式的文件 Data Interchange Format (DIF): 数据交换格式(DIF) Using scan directly: 直接使用 scan 函数 Re-shaping data: 数据重塑 Flat contingency tables: 无格式列联表在导出为文本文件( Export to text files)一节,我们可以看到电子表格类似的文本文件有一系列的变化样式。在这些样式中,数据以矩形格子状呈现,而且还可能包括行列标签。在本节,我们考虑把这种文件导入 R。Next: Fixed-width-f

16、ormat files, Previous: Spreadsheet-like data, Up: Spreadsheet-like data2.1 read.table 的变化样式函数 read.table 是读取矩形格子状数据最为便利的方式。因为实际可能遇到的情况比较多,所以预设了一些函数。这些函数调用了 read.table 但改变了它的一些默认参数。注意,read.table 不是一种有效地读大数值矩阵的方法:见下面的 scan 函数。一些需要考虑到问题是:1. 编码问题 如果文件中包含非-ASCII 字符字段,要确保以正确的编码方式读取。这是在 UTF-8 的本地系统里面读取 Lat

17、in-1 文件的一个主要问题。此时,可以如下处理2.read.table(file(“file.dat“, encoding=“latin1“)3.注意,这在任何可以呈现 Latin-1 名字的本地系统里面运行。4.5. 首行问题 我们建议你明确地设定 header 参数。按照惯例,首行只有对应列的字段而没有行标签对应的字段。因此,它会比余下的行少一个字段。(如果需要在 R 里面看到这一行,设置 header = TRUE。)如果要读取的文件里面有行标签的头字段(可能是空的),以下面的方式读取6.read.table(“file.dat“, header = TRUE, row.names =

18、 1)7.列名字可以通过 col.names 显式地设定;显式设定的名字会替换首行里面的列名字(如果存在的话)。8.9. 分隔符问题 通常,打开文件看一下就可以确定文件所使用的字段分隔符,但对于空白分割的文件,可以选择默认的 sep = “ (它能使用任何空白符作为分隔符,比如空格,制表符,换行符), sep = “ “ 或者 sep = “t“。注意,分隔符的选择会影响输入的被引用的字符串。10.如果你有含有空字段的制表符分割的文件,一定要使用 sep = “t“。11.12. 引用 默认情况下,字符串可以被 “ 或 括起,并且两种情况下,引号内部的字符都作为字符串的一部分。有效的引用字符(

19、可能没有)的设置由参数 quote 控制。对于 sep = “n“,默认值改为 quote = “。 如果没有设定分隔字符,在被引号括起的字符串里面,引号需要用 C 格式的逃逸方式逃逸,即在引号前面直接加反斜杠 。13.如果设定了分隔符,在被引号括起的字符串里面,按照电子表格的习惯,把引号重复两次以达到逃逸的效果。例如14.One string isnt two,“one more“15.可以被下面的命令读取16.read.table(“testfile“, sep = “,“)17.这在默认分隔符的文件里面不起作用。18.19. 缺损值 默认情况下,文件是假定用 NA 表示缺损值,但是,这可

20、以通过参数 na.strings 改变。参数 na.strings 是一个可以包括一个或多个缺损值得字符描述方式的向量。 数值列的空字段也被看作是缺损值。20.在数值列,值 NaN,Inf 和 -Inf 都可以被接受的。21.22. 尾部空字段省略的行 从一个电子表格中导出的文件通常会把拖尾的空字段(包括它们的分隔符)忽略掉。为了读取这样的文件,必须设置参数 fill = TRUE。23.24. 字符字段中的空白 如果设定了分隔符,字符字段起始和收尾处的空白会作为字段一部分看待的。为了去掉这些空白,可以使用参数 strip.white = TRUE。25.26. 空白行 默认情况下,read.

21、table 忽略空白行。这可以通过设置 blank.lines.skip = FALSE 来改变。但这个参数只有在和 fill = TRUE 共同使用时才有效。这时,可能是用空白行表明规则数据中的缺损样本。27.28. 变量的类型 除非你采取特别的行动,read.table 将会为数据框的每个变量选择一个合适的类型。如果字段没有缺损以及不能直接转换,它会按 logical, integer, numeric 和 complex 的顺序依次判断字段类型。 5 如果所有这些类型都失败了,变量会转变成因子。29.参数 colClasses 和 as.is 提供了很大的控制权。 as.is 会 抑制字

22、符向量转换成因子(仅仅这个功能)。 colClasses运行为输入中的每个列设置需要的类型。30.注意,colClasses 和 as.is 对 每 列专用,而不是 每 个变量。因此,它对行标签列也同样适用(如果有的话)。31.32. 注释 默认情况下,read.table 用 # 作为注释标识字符。如果碰到该字符(除了在被引用的字符串内),该行中随后的内容将会被忽略。只含有空白和注释的行被当作空白行。33.如果确认数据文件中没有注释内容,用 comment.char = “ 会比较安全 (也可能让速度比较快)。34.35. 逃逸 许多操作系统有在文本文件中用反斜杠作为逃逸标识字符的习惯,但是

23、Windows 系统是个例外(在路径名中使用反斜杠)。在 R 里面,用户可以自行设定这种习惯是否用于数据文件。36.read.table 和 scan 都有一个逻辑参数 allowEscapes。从 R 2.2.0 开始,该参数默认为否,而且反斜杠是唯一被解释为逃逸引用符的字符(在前面描述的环境中)。如果该参数设为是,以 C 形式的逃逸规则解释,也就是控制符如 a, b, f, n, r, t, v,八进制和十六进制如 040 和 0x2A 一样描述。任何其它逃逸字符都看着是自己,包括反斜杠。37.常用函数 read.csv 和 read.delim 为 read.table 设定参数以符合英

24、语语系本地系统中电子表格导出的 CSV 和制表符分割的文件。这两个函数对应的变种 read.csv2 和 read.delim2 是针对在逗号作为小数点的国家使用时设计的 6。如果 read.table 的可选项设置不正确,错误信息通常以下面的形式显示Error in scan(file = file, what = what, sep = sep, :line 1 did not have 5 elements或者Error in read.table(“files.dat“, header = TRUE) :more columns than column names这些信息可能足以找到问

25、题所在,但是辅助函数 count.fields 可以进一步的深入研究问题所在。读大的数据格子(data grid)时,效率最重要。设定 comment.char = “,以原子向量类型(逻辑型,整型,数值型,复数型,字符型或原味型)设置每列的 colClasses ,给定需要读入的行数 nrows (适当地高估一点比不设置这个参数好)等措施会提高效率。见下面的例子Next: Data Interchange Format (DIF), Previous: Variations on read.table, Up: Spreadsheet-like data2.2 固定宽度格式的文件有时,数据文

26、件没有字段分隔符,但在预先设定的列里面含有字段的内容。在穿孔卡片的时代,这非常普遍。现在,有时也用来节省文件空间。函数 read.fwf 提供了一种简单的方式来读取这样的文件。它会制定一个向量以保存字段的宽度。该函数把文件整行地读入内存,分割结果字符串,导出一个临时的制表符分割的文件,然后调用 read.table。这对小文件已经足够了,但对于更复杂的东西,我们推荐采用 perl 一类的编程语言对文件进行预处理。函数 read.fortran 是处理固定格式文件的一种类似的函数。它使用 Fortran格式的列规范。Next: Using scan directly, Previous: Fix

27、ed-width-format files, Up: Spreadsheet-like data2.3 数据交换模式 (DIF)曾经用于电子表格类似的数据的旧格式是 DIF,即数据交换格式。函数 read.DIF 提供了读取这种文件的简单方式。它为每列设置类型的参数和 read.table 类似。在 Windows 里面,电子表格通常在剪贴板里面以这种格式保存电子表格数据; read.DIF(“clipboard“) 可以直接从剪贴板里面读取数据。这种方法比用 read.table(“clipboard“) 处理含有空单元的电子表格稳健。Next: Re-shaping data, Previ

28、ous: Data Interchange Format (DIF), Up: Spreadsheet-like data2.4 直接使用 scan 函数read.table 和 read.fwf 都是先用 scan 读文件,然后处理 scan 的结果。它们非常便利,但有时直接使用 scan 效果会比较好。函数 scan 有很多参数。大多数参数在函数 read.table 里面也存在。其中最为关键的参数是 what,它是用来指定从文件中读出的变量的模式(mode)的列表。如果该列表已经被命名,它的名字会被用作返回列表的分量。模式可以是数值,字符或复数,并且常常用例子来指定,比如 0, “ 或

29、0i。例如,cat(“2 3 5 7“, “11 13 17 19“, file=“ex.dat“, sep=“n“)scan(file=“ex.dat“, what=list(x=0, y=“, z=0), flush=TRUE)返回一个有三个分量的列表并且丢弃文件中的第四列。还有一个非常有用的函数 readLines。如果你想把所有行读入 R 然后进一步处理,可以用这个便利的函数。scan 的一个最普遍的应用是读入大的矩阵。假定文件 matrix.dat 只是包括一个 200 x 2000 的矩阵 7,那么我们可用A reshape(zz, idvar=“id“,timevar=“var“

30、,varying=list(c(“V1“,“V2“,“V3“,“V4“),direction=“long“)Status Age var V1 id1.1 P 23646 1 45190 12.1 CC 26174 1 35535 23.1 CC 27723 1 25691 34.1 CC 27193 1 30949 45.1 CC 24370 1 50542 56.1 CC 28359 1 58591 67.1 CC 25136 1 45801 71.2 P 23646 2 50333 12.2 CC 26174 2 38227 2.函数 reshape 有比 stack 更为复杂的语法。但

31、是它可以处理比前面例子中列的数目更多的长格式数据。利用 direction=“wide“,reshape 也可以进行相反方向的操作。Previous: Re-shaping data, Up: Spreadsheet-like data2.6 无格式列联表用数组方式展示高维列联表示很不方便的。在分类数据分析中,这种信息常常以含有边的带行列组合的因子水平对应的单元计数的二维数组来体现。行和列是典型的“参差 ”排列,因为只在它们改变时才显示标签。一个明显的习惯是,行从顶往底部读,而列从左往右读。在 R 里面,这种“无格式” 的列联表可以用函数 ftable 创建。 ftable 用一个适合的打印方

32、法创建类 “ftable“ 的对象。举个简单的例子,考虑 R 的标准数据集 UCBAdmissions。这是一个 3 维列联表,用于对 1973 年 UC Berkeley 研究生部六个最大的系的学生申请按照入学和性别的分类。 data(UCBAdmissions) ftable(UCBAdmissions)Dept A B C D E FAdmit GenderAdmitted Male 512 353 120 138 53 22Female 89 17 202 131 94 24Rejected Male 313 207 205 279 138 351Female 19 8 391 244

33、 299 317这种显示方式无疑比数据的 3 维数组描述方式更有用。还有一个函数 read.ftable 用于从文件中读取无格式的列联表。为了处理试图准确地描述行和列变量名字和水平信息的列联表变体,这个函数还有一些其它参数。read.ftable 的帮助页面有一些非常有用的例子。无格式列联表可以用 as.table 转换成数组格式的标准列联表。注意,无格式列联表的特征就是行(可能还有列)标签的“参差”排列。如果给定行变量水平的所有格子(grid),应该使用函数 xtabs 从这种数据创建列联表,而不是用 read.table 读取数据。Next: Relational databases, P

34、revious: Spreadsheet-like data, Up: Top3 导入其它统计软件的数据在本章,我们研究如何读取其它统计系统生成二进制数据文件问题。最好避免这种问题,但若没法得到原始系统的时候,这种问题又是不可避免的。 EpiInfo Minitab SAS S-PLUS SPSS Stata Systat: EpiInfo Minitab SAS S-PLUS SPSS Stata Systat Octave: OctaveNext: Octave, Previous: Importing from other statistical systems, Up: Importi

35、ng from other statistical systems3.1 EpiInfo, Minitab, S-PLUS, SAS, SPSS, Stata, Systat推荐包 foreign 提供了导入这些统计系统产生的文件,导出 Stata 或 SPSS 格式数据的工具。在一些情况下,这些函数可能 read.table 需要的内存少很多。 write.foreign (见导出到文本文件( Export to text files)现在支持 SPSS 和 Stata 类型的数据导出机制。EpiInfo 版本 5 和 6 保存的数据是自我描述的固定宽度的文本文件。 read.epiinfo

36、 可以读入这些 .REC 文件到一个 R 数据框。 EpiData 也产生这种格式的数据。函数 read.mtp 可以导入Minitab 便携式工作表 (Minitab Portable Worksheet)文件。该函数返回一个以工作表作为分量的 R 列表。函数 read.xport 读入 SAS 传输格式(XPORT )的文件,并且返回一个数据框的列表。如果你的系统安装了 SAS,函数 read.ssd 可用来创建和运行以传输格式保存 SAS 永久数据集( .ssd 或 .sas7bdat)的 SAS 脚本。它随后调用 read.xport 去读取结果文件。包 Hmisc 有个类似的函数 s

37、as.get,它也是允许 SAS 脚本。函数 read.S 可以读取(32 位)Unix 或 Windows(或其它操作系统)上由 S-PLUS 3.x,4.x 或 2000 产生二进制对象。这能读取许多但不是全部的 S 对象:特别是,它只能读取向量,矩阵,数据框和含有这类数据对象的列表。函数 data.restore 用于读 S-PLUS 的转储数据( data dump)(由 data.dump 创建)。它有同样的限制(除了 平台的转储数据也可被读取)。它还可能读取来自 S-PLUS 5.x 和 6.x 通过 data.dump(oldStyle=T) 写出的转储数据。如果可以访问 S-P

38、LUS,更可靠的方式是在 S-PLUS 里面导出(dump)对象文件然后在 R 里面载入执行( source)该文件。在 S-PLUS 5.x 和 6.x 里面,需要用 dump(., oldStyle=T),对于读入大对象,优先使用用转储文件作为批量的脚本而非 source。函数 read.spss 可以读取 SPSS 里面 save 和 export 命令创建的文件。它返回一个由被保存数据集中每个变量对应分量的列表。含有值标签的 SPSS 变量可以选择转换为 R 因子。SPSS 数据入口(Data Entry)是创建数据输入的窗体。默认情况下,它创建一种 read.spss不能处理的含有额

39、外格式信息的数据文件。但是,它可能以普通的 SPSS 格式导出数据。Stata 的 .dta 文件是二进制文件格式。函数 read.dta 和 write.dta 可以读写版本 5,6,7/SE 和 8 的 Stata 文件。有值标签的 Stata 变量可以选择性地转换为 R 因子(反之也行)。函数 read.systat 可以读取 Systat 在小字节序机器(little-endian machines)(比如 Windows)上保存(SAVE)的矩形的数据文件(mtype = 1)。这些文件的扩展名为 .sys 或 .syd (最近)。Previous: EpiInfo Minitab

40、SAS S-PLUS SPSS Stata Systat, Up: Importing from other statistical systems3.2 OctaveOctave 是一种线性代数的数值运算系统( http:/www.octave.org),来自包 foreign 的 函数 read.octave 可以读入 Octave 用命令 save -ascii 创建的文本数据格式。该格式支持变量的大多数通用类型,包括标准的原子型(实和复标量/矩阵,和 N 维数组,字符串,极差(range),和布尔值标量/矩阵)和递归式(结构体(structs),单元(cells )和列表)。Next:

41、 Binary files, Previous: Importing from other statistical systems, Up: Top4 关系数据库 Why use a database?: 为什么使用数据库? Overview of RDBMSs: 对 RDBMs 的回顾 R interface packages: R 的接口包Next: Overview of RDBMSs, Previous: Relational databases, Up: Relational databases4.1 为什么使用数据库?R 可以很好处理的数据类型是有限的。既然所有 R 处理的数据都放

42、在内存中,并且在一个函数的执行过程中会创建一个数据集的多个拷贝,因此 R 不适合处理很大的数据集。大于一百兆(或少一点)的数据对象会导致 R 的内存溢出。R 不容易支持并发访问数据。也就是说,如果多于一个用户在访问或者更新同一个数据,一个用户的修改对另外一个用户是不可见的。R 支持数据的永久性,因为用户需要从一个回话中保存数据对象或整个工作表而在随后的会话中再次保存。但被保存数据的格式对 R 是特有的,在其它系统里面不是那么容易被处理。数据库管理系统(Database Management Systems,DBMSs )和,特别是,关系数据库管理系统(RDBMSs) 是 为了更好地做这些事情而

43、设计。. 它们加强的地方在于1. 提供对大型数据库中被选择部分的快速访问。2. 强大的针对数据库的列进行汇总和交叉列表(cross-tabulate)的功能。3. 以更有条理的方式存储数据。这比电子表和 R 的数据框的矩形网格格式更容易组织。4. 支持运行于不同主机上面的客户端的并发访问,同时加强数据访问的安全性限制。5. 有能力作为一个服务很多客户端的服务器。DBMS 可能要用到的统计应用的类型是从数据中提取 1%的样本,对数据交差列表(cross-tabulate)以产生一个多维的列联表,和为单独的分析从数据库中提取数据组。Next: R interface packages, Previ

44、ous: Why use a database?, Up: Relational databases4.2 对 RDBMs 的回顾已经有很多大型的(也是很贵的)商业的关系数据库管理系统( Informix; Oracle; Sybase; IBM 的 DB/2;Microsoft 运行在 Windows 系统上的 SQL Server)和学术的小型系统的数据(如 MySQL,PostgreSQL, Microsoft Access,. )。前者都会强调数据安全性特征。但是界限是很模糊的,比如开源的 PostgreSQL 有越来越多的高端特性 8,以及免费 的 Informix,Oracle 和

45、Sysbase 在 Linux 系统下面都可以获得。还有其它常常使用的数据源,包括电子表格,非关系型数据库,甚至文本文件(可能已经压缩过的)。开放数据库互连(Open Database Connectivity,简写为 ODBC)是使用所有这些数据源的标准。它源于 Windows 系统(见http:/ Linux/Unix 系统也实现这个标准。本章后面描述的所有包都提供了客户端/服务器数据库的客户端。数据库可以放置在一样的机器上或远程(这更常见)。数据库交互时有一个 ISO 标准(事实上有好多种: SQL92 就是 ISO/IEC 9075,也被称为 ANSI X3.135-1992,此外 S

46、QL99 也逐步被使用了)的的交互语言 SQL (结构化查询语言,Structured Query Language,有时读作 sequel:见 Bowman et al. 1996 以及 Kline 和 Kline 2001)。不同的 DBMSs 对这个标准都是在一定程度上支持。 SQL queries: SQL 查询 Data types: 数据类型Next: Data types, Previous: Overview of RDBMSs, Up: Overview of RDBMSs4.2.1 SQL 查询对于常规操作,非常全面的 R 接口可以产生 SQL,但是对于复杂操作,只有直接使

47、用 SQL。习惯上, SQL 用大写字母编写,但是很多用户发现在 R 接口函数里面用小写比较方便。一个关系型 DBMS 以 表格 (tables ) (或 关系 (relations )数据库的方式存储数据。数据库的表格和 R 的数据框类似,因为它们都是由同一类型(数值,字符,日期,货币,.)的 列 (column)或者 字段 (fields)和 包含实体观测数据的 行 (row)或 记录 (record)组成。SQL 查询 是关系数据库里面最常用的操作。典型的查询是下面类型的 SELECT语句SELECT State, Murder FROM USArrests WHERE Rape 30

48、ORDER BY MurderSELECT t.sch, c.meanses, t.sex, t.achieveFROM student as t, school as c WHERE t.sch = c.idSELECT sex, COUNT(*) FROM student GROUP BY sexSELECT sch, AVG(sestat) FROM student GROUP BY sch LIMIT 10上面语句的第一条从已经复制到一个数据库表的 R 数据框 USArrests 数据中选择两列,基于第三列做子集操作,并且让结果数据排序。第二条语句 连接(join)两个表格 stude

49、nt 和 school,随后返回四列。第三和第四个查询进行了一些交差列表操作然后返回计数和平均值。(五个聚合函数分别是 COUNT(*) 以及用于列的 SUM, MAX, MIN 和 AVG)SELECT 查询用 FROM 选择表,WHERE 设定查询条件(或者被 AND 或 OR 分割的多个条件),然后用 ORDER BY 对结果进行排序。和数据框不一样的是,RDBMS 表里面的行最好看作是无序的,如果没有 ORDER BY 语句,顺序是不确定的。你可以对对不止一列进行排序(辞典排序方式),各个列间用逗号分隔。把 DESC 放在 ORDER BY 后面会让结果按降序排列。SELECT DISTINCT 查询只返回被选中的表中不同的行。GROUP BY 字句选择基于标准的行的子集。如果不止一列被设定(逗号分隔),可以用五个聚合函数中的一个对多维交差分类的数据进行汇总。 HAVING 字句可以基于聚合值选择或去掉一些组。如果

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报