数据分析与绘图的编程环境(R语言).pdf
R语言简介R语言笔记:数据分析与绘图的编程环境版本 1.7R Development Core TeamJune 10,2006Contents1绪 论与基 础11.1R语言环境.11.2相关的软件和文档.11.3R与统计.21.4R与视窗系统.21.5R的交互使用.21.6入门训练.31.7获取函数和功能的帮助信息.31.8R的命令、对大小写的敏感,等等.31.9对已输入命令的记忆和更改.41.10 命令文件的执行和输出的转向到文件.41.11 数据的保持与对象的清除.42简 单操作;数值 与向 量52.1向量与赋值.52.2向量运算.52.3产生规则的序列.62.4逻辑向量.72.5缺失值.72.6字符向量.72.7索引向量(index vector);数据集子集的选择与修改.82.8对象的其他类型.93对 象,模 式和属 性103.1固有属性:模式和长度.103.2改变对象的长度.113.3属性的获取和设置.113.4对象的类别.114有 序因子 与无序 因子124.1一个特例.124.2函数 tapply()与ragged 数组.124.3有序因子.135数 组和矩 阵145.1数组.145.2数组的索引和数组的子块.145.3索引数组.15iCONTENTSii5.4函数 array().165.4.1向量,数组的混合运算,重复使用规则.165.5两个数组的外积.175.6数组的广义转置.175.7专门的矩阵功能.185.7.1矩阵乘法.185.7.2线性方程和矩阵的逆.185.7.3特征值和特征向量.195.8奇异值分解与行列式.195.9最小二乘拟合及QR 分解.195.10 构建分区矩阵,cbind()和rbind().195.11 连接函数 c(),针对数组的应用.195.12 由因子生成频数表.206列 表和数 据帧216.1列表.216.2构建和修改列表.226.2.1连接列表.226.3数据帧.226.3.1创建数据帧.226.3.2attach()与detach().236.3.3使用数据帧.236.3.4挂接任意列表.246.3.5管理搜索路径.247从 文件中 读取数 据257.1函数 read.table().257.2函数 scan().267.3内建数据集的存取.267.3.1从其他 R功能包中载入数据.277.4编辑数据.278概 率分布288.1R 作为一个统计表的集合.288.2检测数据集合的分布.298.3单样本和两样本检验.329语 句组、循环和 条件 操作359.1表达式语句组.359.2控制语句.359.2.1条件执行:if 语句.359.2.2重复执行:for 循环,repeat 和 while.3510 编 写自己 的函数3710.1 简单示例.3710.2 定义新的二元操作符.3810.3 指定的参数和默认值.3810.4 参数.3910.5 函数内的赋值.3910.6 更多高级示例.39CONTENTSiii10.6.1区组设计的效率因子(E?ciencyfactors).3910.6.2删除打引数组中的所有名称.4010.6.3递归的数值积分.4110.7 范畴(scope).4110.8 定制环境.4310.9 类别,通用函数和对象定位.4411 R 的统 计模 型4511.1 定义统计模型;公式.4511.1.1对比(contrasts).4811.2 线性模型.4811.3 用于释放模型信息的通用函数.4811.4 方差分析与模型比较.4911.4.1方差分析表(ANOVAtables).4911.5 更新拟合模型.5011.6 广义线性模型.5011.6.1族(families).5111.6.2函数 glm().5111.7 非线性最小二乘和最大似然模型.5311.7.1最小二乘.5311.7.2最大似然.5411.8 一些非标准的模型.5512 图 形过程5612.1 高级绘图命令.5612.1.1函数 plot().5612.1.2显示多元数据.5712.1.3显示图形.5812.1.4高级绘图函数的参数.5812.2 低级绘图命令.5912.2.1数学注释.6112.2.2Hershey 矢量字体.6112.3 图形的交互.6112.4 使用图形参数.6212.4.1持续性变更(Permanentchanges):par()函数.6212.4.2临时性变更:图形函数的参数.6312.5 图形参数列表.6312.5.1图形元素.6312.5.2坐标轴和标记.6412.5.3图边缘(Figuremargins).6512.5.4多图环境.6512.6 设备驱动.6712.6.1文本文档的 PostScript 图表.6712.6.2多重图形设备.6712.7 动态图形.68Chapter1绪论与基础1.1R语言环境R是一套由数据操作、计算和图形展示功能整合而成的套件。包括:?有效的数据存储和处理功能,?一套完整的数组(特别是矩阵)计算操作符,?拥有完整体系的数据分析工具,?为数据分析和显示提供的强大图形功能,?一套(源自 S语言)完善、简单、有效的编程语言(包括条件、循环、自定义函数、输入输出功能)。在这里使用”环境”(environment)是为了说明R的定位是一个完善、统一的系统,而非其他数据分析软件那样作为一个专门、不灵活的附属工具。R很适合被用于发展中的新方法所进行的交互式数据分析。由于R是一个动态的环境,所以新发布的版本并不总是与之前发布的版本完全兼容。某些用户欢迎这些变化因为新技术和新方法的所带来的好处;有些则会担心旧的代码不再可用。尽管R试图成为一种真正的编程语言,但是大家不要认为一个由R编写的程序可以长命百岁。1.2相关的软件和文档R可以被当作 S语言(由 Rick Becker,JohnChambers 和AllanWilks在Bell 实验室开发)的实现工具,或者S-Plus系统的基本形态。S语言 的 发 展 变 化 可 以 参 考JohnChambers与 其 他 人 合 作 的 四 本 书。对R 来说,基本的参考书是The New S Language:A ProgrammingEnvironmentfor Data Analysisand Graphics(RichardA.Becker,John M.Chambers andAllanR.Wilks)。对于 1991 年发布的S(Sversion3)可以参考StatisticalModels in S(edited by John M.Chambers and TrevorJ.Hastie)。更多的参考书目请查看本手册的相应部分。此外,S-Plus的相关文档都可以用于R,只是要注意R 与S执行工具之间的差别。1CHAPTER1.绪论与基础21.3R与统计在我们对R语言环境的介绍中并没有提到统计,不过很多人都把R 作为一个统计系统来使用。我们倾向于把它当作环境,使得经典和现代统计技术在其中得到应用。一部分已经被内建在基本的R 语言环境中,但是更多的是以包的形式提供的。由8个包是随着R 一同提供的(称作标准包),其它的可以通过CRAN的成员网站获得(通过http:/cran.r-project.org)。通过 R 可以使用绝大多数的经典或者最新的统计方法,不过用户需要花一些功夫来找出这种方法。S(和 R)与其他主流的统计系统在本质上有一个很重要的不同。在S中,统计分析通常由一系列的步骤完成,同时将交互的结果存储在对象中。所以,尽管 SAS 和SPSS在一个回归或者判别分析中会给出丰富的输出结果,R只是给出一个最小的输出,而将结果保存在一个适当的对象中由R 函数进行后续查询。1.4R与视窗系统使用 R 最便捷的方式是在一个运行视窗系统的图形工作站上。这份指南就是为拥有这项便利的用户准备的。尽管我们绝大部分的内容都是来讲R 环境的一般应用,我们还是会时不时的提到R 在X window系统下的应用。与操作系统的直接互动对多数用户来说都是必要的。在这份指南中我们主要讨论在 UNIX系统下的互动,所以Windows下的 R 用户需要做出一些小的调整。对工作站的定制是一项直接而有效但又单调乏味的过程,在这里我们并不会作更深入的讨论。如果您在这方面遇到了困难可以向你身边的专家寻求帮助。1.5R的交互使用R 程序在等待输入命令时会给出提示符,默认的提示符是,与UNIX的shell提示符是相同的。不过如果你愿意的话,我们可以轻松的更改R 的提示符。在这里我们先假定UNIX的shell提示符是$。在 UNIX下使用 R 可以按照下面的推荐步骤来做:1.创建一个独立的子目录来存储解决这个问题所用的数据文件,将目录命名为 work.这个目录将作为你当前任务的工作目录.$mkdirwork$cd work2.启动 R 的程序$R3.使用 R 的各种命令4.退出 R q()此时您会被询问是否保存您在R 任务中的数据。你可以回答yes,no 或cancel(使用缩略字符也可以)分别对应退出前保存数据,不保存数据退出或回到R任务中。被存储的数据在之后的R 任务中可以继续使用。之后的 R 任务就更简单了。1.令 work成为工作目录,并启动R 程序。$cd work$RCHAPTER1.绪论与基础32.使用 R,在任务结束时用q()来中止。在Windows下使用 R 的步骤与上面基本相同。创建一个文件夹作为工作目录,并将其设定R 快捷方式的在”起始位置”中。然后双击图标启动R。1.6入门训练我们非常推荐读者们在继续进行之前通过一个示例来获取在计算机上使用R 的感觉。这个示例由示例训练给出。1.7获取函数和功能的帮助信息和UNIX中的 man 命令一样,R 拥有一个内建的帮助功能。对于任意一个指定的函数,例如solve,命令是help(solve)或者?solve对于由特殊字符指定的功能,这些参数必须用单引号或双引号括起来,使之成为一个“字符串”:同时对于某些含有if,for或者 function的合成词也要这样处理。help()不论是单引号还是双引号都可以包含在另一个中,例如字符串:”It sim-portant”。我们的惯例是使用双引号。一般情况下帮助文档的HTML格式都是被安装了的,可以通过运行下面的命令 help.start()启动一个 Web 浏览器(UNIX下是 netscape浏览器)来浏览包含超级链接的帮助页面。在UNIX下,后续的帮助请求回被发送到HTML为基础的帮助系统中。页面中Search EngineandKeywords连接可以通过所包含的列表对各种函数进行非常有效的查询。这是你熟悉并且理解R 提供的各种功能的好方法。命令 help.search允许我们用多种方式来搜索帮助信息:细节和例子可以用?help.search来查询。与某个主题相关的例子通常可以用下面的命令得到 example(topic)Windows版本的 R 还有另外可选的帮助系统,详细资料请用?help来查询。1.8R的命令、对大小写的敏感,等等从技术角度来讲,R是一种表达式语言,它的语法是非常简单的。和大多数UNIX为基础的软件包一样,R 对大小写是敏感的,也就是说A 和 a是不同的代号并且将代表不同的变量。R语言名称中可用的字符集由当前的操作系统决定(即由 locale决定)。正常情况下所有的字母和数字都是可用的(在某些国家包括重音字符),还包括句点.*note1*,但是要注意名称不能以数字开始。基本的命令由表达式或者赋值语句组成。如果一个表达式被作为一条命令给出,它将被求值、打印而表达式的值并不被保存。一个赋值语句同样对表达式求值之后把表达式的值传给一个变量,不过并不会自动的被打印出来。命令由分号(;)来分隔,或者另起新行。基本命令可以由花括号(和)合并为一组复合表达式。注释几乎可以被放在任何地方,只要是以井号(#)开始,到行末结CHAPTER1.绪论与基础4束的都是注释。如果一个命令在行莫仍没有结束,R将会给出一个不同的提示符,默认的是+在第二行和后续行R 将继续读入,直到命令从语法角度讲已经输入完成了。这个提示符也可以由用户更改。一般情况忽略继续输入提示符就行。1.9对已输入命令的记忆和更改在许多版本的UNIX和Windows下,R 提供了对已输入命令记忆和再次执行的一种机制。使用垂直方向箭头的按键可以在命令记录中向前或向后滚动。当一个命令用这种方法定位之后,你就可以使用左右键改变光标的位置,对命令行进行编辑(用删除或者按其他按键进行添加)。相信的资料在稍后提供:参见命令行编辑器。记忆和编辑功能在UNIX下是高度可定制的。你可以在 readline库的手册中找到具体的方法。作为选择,Emacs 的文本编辑器提供了一种更为一般的支持机制(通过 ESS,EmacsSpeaksStatistics)来为R 下面的交互工作服务。参见R 和Emacs。1.10命令文件的执行和输出的转向到文件如果命令存储于一个外部文件中,比如工作目录work中的 commands.R,他们可以随时在R的任务中被执行 source(commands.R)在Windows中Source也可以由 File菜单执行。函数sink,sink(record.lis)将把所有后续的输出由终端转向一个外部文件,record.lis。命令 sink()将把信息重新恢复到终端上。1.11数据的保持与对象的清除R 所创建、操作的实体是对象。对象可以是变量、数组、字符串、函数以及由这些元素组成的其它结构。在一个R 的任务过程中,对象根据名称被创建和存储(我们将在下个训练中讨论这个过程)。下面的命令 objects()(作为选择,ls()可以)被用来显示目前存储在R 中的对象的名字。而当前存储的所有对象的组合被称为workspace。清除对象可以使用rm 命令:rm(x,y,z,ink,junk,temp,foo,bar)所有在一个R任务中被创建的对象都可以在文件中被永久保存,并在其它的 R 任务中被使用。在每个R 任务结束时用户都有机会保存当前有效的所有对象。如果用户这样做的话,对象将被写入当前目录一个名为.RData*Note3*。当 R 被再次启动时R 会从这个文件中再载入workspace。同时相关的命令记录也被载入。推荐大家在用R 进行不同的分析时分别使用不同的工作目录。在分析过程中创建名为 x或y 的对象是很普通的。在一个单独的分析中它们的含义也会很清晰,但是如果几个不同的分析在同一个工作目录中被处理的话你将会发现分辨它们的含义是件很痛苦的事情。Chapter2简单操作;数值与向量2.1向量与赋值R对命名了的数据结构进行操作。最简单的数据结构是数字向量,数字向量是由一组有序数字组成的单个实体。下面的R命令将创建一个名为x,包含 5个数字(10.4,5.6,3.1,6.4 和21.7)的向量:x assign(x,c(10.4,5.6,3.1,6.4,21.7)通常使用的操作符?-可以被当作函数assign()的简写。赋值同样可以在另一个方向进行,改变赋值操作符的方向就可以了。所以同样的复制操作还可以被写成 c(10.4,5.6,3.1,6.4,21.7)-x如果一个表达式被当作一个完整的命令,它的值将被打印到终端但不被储存。所以如果我们使用这个命令 1/x五个值的倒数将被打印到终端上(还有 x的值)。下面的这个赋值操作 y v-2*x+y+15CHAPTER2.简单操作;数值与向量6产生一个长度为11的新向量 v,逐个元素的进行运算,其中2*x 被重复 2.2次,y被重复 1次,常数1被重复 11次。逐个元素进行运算的操作符包括+,-,*,/,此外所有普通的运算函数都能够被使用。log,exp,sin,cos,tan,sqrt等等,而且意义并没有什么变化。max和min的作用是选出所给向量中最大的或最小的元素。range函数的值是一个长度为2的向量,即 c(min(x),max(x)。length(x)返回了向量x中元素的个数,也就是x的长度。sum(x)给出了 x中所有元素的总和,prod(x)给出 x中所有元素的乘积。两个统计函数是mean(x)和var(x),分别计算样本均值和样本方差,这两个函数分别相当于sum(x)/length(x),sum(x-mean(x)2)/(length(x)-1)。如果 var()的参数是一个n*p 的矩阵,那么函数的值是一个p*p 的样本协方差矩阵,认为每行是一个p变量的样本向量。sort(x)返回一个与 x具有相同长度的向量,其中的元素按招升序排列。还有其他更灵活的排序功能(参见 order()和sort.list()。需要注意不论参数中有几个向量,max和 min给出的是所有向量的一个最大值或最小值。而平行的最大最小函数 pmax和pmin 将返回一个与最长的向量长度相等的向量,向量中的元素由参数中所有向量在相应位置的最大值(最小值)组成。绝大多数用户并不会关心一个数字向量中的数字究竟是整数、实数还是复数。在计算机中运算是按照双精度的实数或复数进行的。如果要使用复数,需要直接给出一个复数部分。因此sqrt(-17)将会返回 NaN(无效数值)和一个警告,而sqrt(-17+0i)将按照复数进行运算。2.3产生规则的序列R拥有很多产生常用数列的方法。例如1:30就是向量 c(1,2,.,29,30)。在一个表达式中冒号(:)具有最高的优先级(即最先进行运算),所以,比如2*1:15 就是向量 c(2,4,.,28,30)。令 n seq(-5,5,by=.2)-s3在变量 s3中产生向量c(-5.0,-4.8,-4.6,.,4.6,4.8,5.0)。相似的 s4 s5 temp 13令temp 成为一个与 x 长度相同,相应位置根据是否与条件相符而由TRUE 或FALSE组成的向量。逻辑操作符包括,=,完全相等=和不等于!=。此外,如果 c1和 c2时逻辑表达式,那么c1&c2 是它们的交集(”and”),c1|c2 是它们的并集(”or”),而!c1是c1 的反面。逻辑向量可以在普通的运算中被使用,此时它们将被转化为数字向量,FALSE当做 0而TRUE 当做 1。不过,有些情况下逻辑向量和它们对应的数值并不是等价的,相关的例子参见下部分。2.5缺失值某些情况下一个向量的成分并不全是已知的。当某个元素或者数值从统计角度讲是”不可用”(”not available”)或者”缺失值”(”missing value”)时,它们在向量中的位置将被保留,同时被赋值为一个特殊值NA。一般来讲一个NA的任何操作都将返回 NA。这条规则的出发点是如果一个操作的具体要求不够完整,是不能得出结果的,因此是无效的。函数is.na(x)返回一个逻辑向量,这个向量与x有相同的长度,并且由相应位置的元素是否是NA来决定这个逻辑向量相应位置的元素是TRUE 还是 FALSE。z-c(1:3,NA);ind 0/0或 Inf-Inf都将返回一个NaN,因为结果无法被明确的定义。函数is.na(xx)对于 NA和NaN 值都返回 TRUE。要想区分它们的话,函数is.nan(xx)只对 NaN 值返回 TRUE。2.6字符向量字符和字符向量在R中都被广泛的使用,比如图表的标签。在显示的时候,相应的字符串由双引号界定,e.g.,x-values,New iterationresults。字符串在输入时可以使用单引号()或双以号(”),但在打印时用双引号(有时不用引号)。R使用与 C语言风格基本相同的转义符,即backslash,所以输入打印的也是,而引号”在输入时应当写作.其它有用的转义符包括n,换行,t,tab 和b,回格。字符向量可以通过函数c()连接;这样的例子会经常出现的。函数 paste()可以接受任意个参数,并从它们中逐个取出字符并连成字符串,形成的字符串的个数与参数中最长字符串的长度相同。如果参数中包含数字的话,数字将被强制转化为字符串。在默认情况下,参数中的各字符串是被一个空格分隔的,不过通过参数sep=string用户可以把它更改为其他字符串,包括空字符串。这个函数的功能最好通过例子来理解。例如 labs y (x+1)(!is.na(x)&x0-z上面的命令创建一个对象z,其中的元素由向量x+1中与 x中的非缺失值和正数对应的向量组成。2.正整数的向量。这种情况下索引向量中的值必须在集合1,2,.,length(x)中。在返回的向量中包含索引向量中指定元素,并且在结果中按照索引向量中的顺序排列。索引向量的长度可以是任意的,返回的向量与索引向量由相同的长度。例如x6是 x的第六个元素,而 x1:10选取了 x的前 10个元素(假设 x的长度不小于10)。而 c(x,y)rep(c(1,2,2,1),times=4)产生了一个字符向量,长度为16,由x,y,y,x重复 4次而组成。3.负整数的向量。这种索引向量的作用是把某些值派出而不是包括进来。因此 y fruit names(fruit)lunch xis.na(x)yy 0-yy y z digits d e e3 alpha attr(z,dim)winter将按照数据帧的形式来打印它,和矩阵的形式差不多,而 unclass(winter)将把它按照一个普通的列表来打印。这个功能你只会在一些相当特殊的情况下才会用到,其中一个便是当你要学习类别和通用函数的概念时。在sec10.9我们还会再讨论通用函数和类别,不过只是简要的。Chapter4有序因子与无序因子因子1是一种向量对象,它给自己的组件指定了一个离散的分类(分组),它的组件由其他等长的向量组成。R提供了有序因子和无序因子。因子的“实际”应用是与模型公式相联系的(参见),我们在这里先看4.1一个特例假设,我们有从澳大利亚来的30个税务会计作为样本他们各自所在省份由下面的字符向量指定 state statef statef1tassa qldnsw nsw ntwa wa qldvicnsw vicqldqldsa16tassantwa vicqldnsw nsw wa saactnsw vicvicactLevels:actnsw ntqldsatasvicwa函数 levels()可以用来观察因子中有多少不同的水平。4.2函数tapply()与ragged 数组继续前面的例子,假设我们拥有这些会计的收入数据 incomes incmeans stderr incster incsteractnswntqldsa tasvicwa1.54.31024.54.10612.73860.55.2442.6575作为一个练习,你可能还想得到收入均值95%的置信区间。可以通过下面的方法完成:先用tapply()应用函数 length()得到样本长度,然后用函数qt()来获得 t分布的分位点。函数 tapply()可以通过多类别的方法处理更复杂的向量索引。例如,我们可能像依据省份和性别来分割税务会计的数据,在一个简单的例子中(只有一个类别),我们的思路可以是这样的:根据类别中不同的项,向量中的值被分成不同的组,然后,函数被分别应用于每一个组。返回指是函数结果的向量,由类别的水平标记。一个向量和一个标记用的因子合并有时会成为一个ragged array,因为子类别的大小可能是不规则的。当子类别的大小全都相同时,合并过程中会自动完成索引,而且这样显然会更有效率,正如我们在下一章将要看到的那样。4.3有序因子因子的水平按照字母顺序存储,不过如果被明确的指定,他们将按照指定的顺序存储。有时因子的水平具有其原始的顺序,而且这种顺序可以在我们的统计分析中被用到,所以我们需要一定的方法来记录这种顺序。函数ordered()可以创建这种有序因子,但是这种有序因子同因子是有差别的。在多数情况下,有序因子和无序因子的差别仅仅是前者在输出结果是其水平,不过在拟合线性模型时,两种因子是有实质差异的。Chapter5数组和矩阵5.1数组数组可以看成一个由递增下标表示的数据项的集合,例如数值。R语言对创建和处理数组及其特例矩阵提供了简单而方便的功能,尤其是对矩阵。一个矩阵就是一个2维数组。维数向量中的值规定了下标k 的上限。下限一般为 1。如果一个向量需要在R中以数组的方式被处理,则必须含有一个维数向量作为它的 dim属性。假设,例如,z是一个由 1500个元素组成的向量。下面的赋值语句 dim(z)x x,1,2,3,4,51,15913172,261014183,371115194,48121620 i i,1,21,132,223,31 xi19 6 3 xi x,1,2,3,4,51,15013172,201014183,071115194,48121620作为一个不太重要的例子,假定,我们要为一个由因子blocks(b levels)和varieties(v levels)定义的区组设计生成一个设计矩阵。进一步的,我们假设实验中包括n个计划(plot),我们可以进行如下操作:Xb Xv ib iv Xbib Xviv X N N Z Z dim(Z)Z D ab ab f z d fr plot(as.numeric(names(fr),fr,type=h,xlab=Determinant,ylab=Frequency)请注意,在这里通过将频数表的names强制转化为数值型,我们的到了行列式值的区间。而处理这个问题更显而易见的方式是使用for 循环,但是由于使用for 循环的效率太低,并不适合用在这里。关于for 循环我们会在chapter9讲到。5.6数组的广义转置函数 aperm(a,perm)可以用来对一个数组进行排列,参数perm必须是整数 1,.,k 的一个排列,此处k 是a下标的个数。这个函数得到一个与a相同大小的数组,原有的维被 permj给定的新维取代。理解这个操作最简单的方式应当是把它来CHAPTER5.数组和矩阵18当作一种广义的矩阵转置。如果A是一个矩阵(也就是一个双下标数组)由命令 B-aperm(A,c(2,1)得到的 B其实就是 A的转置。对这个特定的操作,我们由一个更简单的函数t(),所以我们还可以用B A*B是相应位置上元素乘积组成的矩阵,而 A%*%B是矩阵乘积。如果X是向量,那么 x%*%A%*%x是一个二次型。函数 crossprod()产生一个交叉乘积(cross product),即 crossprod(X,y)与t(X)%*%y达成相同的效果,但crossprod()的效率更高。如果省略第二个参数,相当于第一个参数与自己做运算,即crossprod(X)等价于 crossprod(X,X)。函数 diag()的作用取决于它的参数,如果v是向量,diag(v)返回一个由 v的元素为对角元素的对角矩阵。若M 为矩阵,diag(M)返回一个由 M主对角元素组成的向量。这沿用了diag()在Matlab中的传统用法。此外,多少有些让人迷惑,如果 k只是一个数值,那么diag(k)是一个 k k的单位矩阵。5.7.2线性方 程和矩阵的逆求解线性方程是矩阵乘法的逆运算。在 b solve(A,b)对线性方程求解。返回x的值(可能会有一些精度上的损失),请注意,人们很少通过solve(A)求A的逆 A-1,并在线性代数式x=A-1b中使用。因为与solve(A,b)相比 x ev evals eigen(Sm)将连同名称打印列表 eigen(Sm)的两部分。5.8奇异值分解与行列式15.9最小二乘拟合及QR 分解函数 ls?t()返回由最小二乘拟合的结果组成的列表。形如 ans Xplus b fit res X Lst x Lst Lst5 list.ABC accountants attach(lentils)将数据帧置于搜索路径的位置2,而位置 1上并没有变量u,v,w,这些来自数据帧的变量仅在他们自己的权限范围内有效。此时,类似 u lentils$u detach()更精确的说,这个操作将搜索路径位置2的实体卸载了。因此当前内容中变量u,v,w 不再可见。除非使用列表标记lentils$u这样的方式。存储在大于2的位置上的实体可以通过detach 加上位置编号的方式卸载。不过,更安全的方法是使用名称,例如detach(lentils)或detach(lentils)NOTE:当前发行版的R可以在搜索路径中包含至多20个项目。避免多次挂接同一个数据帧。在结束对数据帧中变量的使用后尽快将其卸载。NOTE:当前发行版的R中,列表和数据帧只能在位置2或更靠后的位置上挂接。不能对一个挂接的列表或数据帧直接赋值。(因此,某种意义上将它们是静态的)6.3.3使用数 据帧在同一个工作目录下方便的处理多个不同问题,可以遵循下面的惯例。?将每个独立的,适当定义的问题所包含的所有变量收入同一个数据帧中,并赋予合适的、易理解、易辨识的名称;?处理问题时,当相应的数据帧挂接于位置2,同时在第1层工作目录下存放操作的数值和临时变量;?在结束一次工作之前,将你认为对将来有参考价值的变量通过$标记的形式添加到数据帧里面,然后detach();?最后,将工作目录下所有不需要的变量剔除,并且尽量将剩下多余的临时变量都清除干净。这样我们可以很简单的在同一个目录下处理多个问题,而且对每个问题都可以使用 x,y,z这样的变量名。CHAPTER6.列表和数据帧246.3.4挂接任 意列表attach()是具有一般性的函数,即它不仅能够将目录和数据帧挂接在搜索路径上,还能挂接其他类别的对象。特别是模式为list的对象可以通过相同的方式挂接:attach(any.old.list)任何被挂接的对象都可以用detach 来卸载,通过指定位置编号或者指定名称这样的方式。6.3.5管理搜 索路径函数 search 将显示目前的搜索路径。所以用来跟踪已挂接或已卸载的数据帧、列表(以及功能包)是非常有用的。初始的结果是 search()1.GlobalEnvAutoloadspackage:base此处,.GlobalEnv是工作区(workspace)1当lentils 被挂接后 search()1.GlobalEnvlentilsAutoloadspackage:base ls(2)1uvw正如我们所见ls(或 objects)命令可以用来检查搜索路径任意位置上的内容。最后,我们卸载数据帧,并且确认它们已被从搜索路径上删除。detach(lentils)search()1.GlobalEnvAutoloadspackage:base1关于第二项的含义请通过在线帮助查询autoloadChapter7从文件中读取数据通常大规模的数据对象都是从外部文件中读取值,而不是在R任务运行过程中从键盘录入。R的输入功能比较简单,其要求相当严格,很不灵活。R的设计者认为你完全可以通过其他的工具,例如文件编辑器和Perl1来修改输入文件,使之符合 R的要求。一般来说,这还是很简单的。如果变量可以通过数据帧存储,正如我们所建议的,我们就可以通过函数read.table()直接将完整的数据帧读出。还有一个更原始的输入函数scan(),可以直接读入。关于 R数据输入输出的详细信息请参考R data Import/Export手册。7.1函数read.table()要直接将整个数据帧读出,所用的外部文件需要符合特定的格式。?第一行应当提供数据帧中每个变量的名称?此外的每一行中包含一个行标号(必须在第一项的位置)和其它各变量的值如果文件的第一行所包含的项目比第二行少,也被认为是有效的。所以一个数据帧的数据来源文件,其前几行可以是下面这样的。包含名称和行标号的输入文件形式PriceFloorAreaRoomsAgeCent.heat0152.00111.083056.2no0254.75128.071057.5no0357.50101.0100054.2no0457.50131.069068.8no0559.7593.090051.9yes.默认情况下,数值项(出了行标号)将被当作数值变量读入。非数值变量,如例子中的Cent.heat,将被作为因子读入。如果需要的话,这个规则可以改变。之后,函数 read.table()就可以直接读出一个数据帧了。1在Unix 下可以使用Sed或Awk25CHAPTER7.从文件中读取数据26 HousePrice HousePrice inp label-inp1;x-inp2;y inp label-in$id;x-in$x;y X xnew xnew q的最小 x)求值,并根据分布进行模拟。DistributionR nameadditionalargumentsbetabetashape1,shape2,ncpbinomialbinomsize,probCauchycauchylocation,scalechi-squaredchisqdf,ncpexponentialexprateFfdf1,df1,ncpgammagammashape,scalegeometricgeomprobhypergeometrichyperm,n,klog-normallnormmeanlog,sdloglogisticlogislocation,scalenegativebinomialnbinom size,probnormalnormmean,sdPoissonpoislambdaStudent stt df,ncpuniformunifmin,maxWeibullweibullshape,scaleWilcoxonwilcoxm,n对于所给的名称,加前缀d代表密度(density),p代表 CDF,q代表分位函数,r代表模拟(随即散布)。这几类函数的第一个参数是有规律的,形为dxxx 的函数为 x,pxxx 的函数为 q,qxxx 的函数为 p,rxxx 的函数为 n(rhyper和rwilcox 是特例,他们的第一个参数为nn)。目前为止,非中心参数(non-centralityparameter)仅对 CDF 和少数几个其他函数有效,细节请参考在线帮助。所有 pxxx 和qxxx 的函数都具有逻辑参数lower.tail和log.p,而所有的 dxxx 函数都有参数 log,这个是我们可以直接通过-pxxx(t,.,lower.tail=FALSE,log.p=TRUE)获取,比如说,累积失效函数(cumulative/integratedhazard function),H(t)=28CHAPTER8.概率分布29-log(1-F(t),以及更精确的对数似然(通过dxxx(.,log=TRUE))。此外,对于来自正态分布,具有学生化样本区间的分布还有ptukey 和qtukey 这样的函数。下面是一些例子#2-tailedp-valuefortdistribution 2*pt(-2.43,df=13)#upper1%pointforan F(2,7)distribution qf(0.99,2,7)8.2检测数据集合的分布对于给定的(单变量)数据集合我们有许多方法检测其分布情况。最简单的方法是检测数值。函数summary和fivenum 这两个函数可以分别给出两个有轻微差异的摘要,函数stem 可以将数值显示出来(茎叶图”stemand leaf”plot)data(faithful)attach(faithful)summary(eruptions)Min.1stQu.MedianMean 3rdQu.Max.1.6002.1634.0003.4884.4545.100 fivenum(eruptions)11.60002.15854.00004.45855.1000 stem(eruptions)The decimalpointis1 digit(s)totheleftofthe|16|07035555558818|00002223333333