矩阵的特征多项式式的描述如下: 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ... 现在请你求出该矩阵的特征多项式式

(本小题满分12分)已知算法如下:(1)指出其功能,(2)画出流程图。S1输入xS2若x&-2,执行S3;否则,执行S6S3y=x^2+1S4输出yS5执行S12S6若-2=&x&2,执行S7;否则执行S10S7y=xS8输出yS9执行S12S10y=x^2-1S11输出yS12结束。解:算法的功能为求函数:-----4分的函数值。程序框图略--------12分略河南省偃师高中学年下学期高一第一次月考数学试题答案
解:算法的功能为求函数:-----4分 的函数值。 程序框图略 --------12分相关试题47,最全面的47文章 - 电子工程世界网
在电子工程世界为您找到如下关于“47”的新闻
47资料下载
VSUPPA VSUPLLC VSUPY VSUPC VSUPSYL3 3.3uH R104 75 OHM R105 75 OHMC89 220nFR99 75 OHM330pF VSTBY VSUPF VSUPAI 53 57 56 54 28 27 31 32 33 34 37 38 39 40 41 42 43 44 47 48 49 50 23 22 21 20 19 55 58 24 60...
5 备份寄存器(BKP) 47
5.1 BKP简介 47
5.2 BKP特性 47
5.3 BKP功能描述 47
5.3.1 侵入检测 47
5.3.2 RTC校准 48
5.4 BKP寄存器描述 48
5.4.1 备份数据寄存器x(BKP_DRx) (x = 1 … 10) 48
5.4.2 RTC时钟校准寄存器(BKP_RTCCR) 48...
47译码器器的verilog源代码,经过编译仿真的,绝对真确,对初学者很有帮助...
【星嵌电子-实验47】钟表(可定时).rar...
BZX55C( A )( B )( D )2V4-BZX55C( A )( B )( D )47...
.................................................. 46
7 工程现场 ...................................................... 47
7.1 人员和环境要求 ........................................ 47
7.2 接地要求 .............................................. 47
7.3 操作...
LNA设计宽频带低噪声放大器优化设计赵 震(北京理工大学电子工程系,100081)[摘要] 本文简要介绍了 Ansoft 公司的 Serenade 8.71 仿真软件, 并以 47~750MHz 低噪声放大器设计为例, 详细介绍了使用 Serenade 8.7 软件进行分析和优化设计该电路的过程,最终获得很好的结果: 工作频带:47~750MHz,噪声系数...
电话机印制板图图46(4) HA888(25)P/T型电话机按键板图图47(1) HA888(26)P/T型电话机原理图图47(2) HA888(26)P/T型电话机元件排列图图47(3) HA888(26)P/T型电话机印制板图图47(4) HA888(26)P/T型电话机按键板图图48(1) HA888(26)D型电话机原理图图48(2) HA888(26)D型电话机元件排列图图48(3...
3.1 多项式的表示方法 37
3.1.1 系数表示法 37
3.1.2 点表示法 38
3.1.3 [算法9] 系数表示转化为点表示 38
3.1.4 [算法10] 点表示转化为系数表示 42
3.1.5 【实例7】 系数表示法与点表示法的转化 46
3.2 多项式运算 47
3.2.1 [算法11] 复系数多项式相乘 47
3.2.2 [算法12...
Gb 4706 家用和类似用途电器的安全 全套 72册 47...
47相关帖子
=redirect&goto=findpost&pid=2215278&ptid=552731][color=#999999]曾经in 发表于
10:47[/color][/url][/size]
采样电阻烧功率不够,换大功率电阻或者用康铜丝
有频响是正常的,提高pwm频率超出听力范围就不会了,或者 ...[/quote]
电磁阀电阻15ohm左右,理论上讲,12V100%占空比也不到1A...
:47[/color][/url][/size]
不知道从哪里入手,是按照线来呢还是按照元件来开始呢?[/quote]
这是单面板,应该很好测量,边画边测
也是练习基本功
可先从一个角开始,不懂的元件要事前做足功课,比如三极管的三个极搞清楚排列,二极管的正负等 [quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid...
23:47[/color]
[color=#999999]既然已经知道错在哪里,把电原理图改正后再贴出来吧。贴出来后我们看看是否可行。[/color][/quote]
中午的时候改下! [url=home.php?mod=space&uid=41670]@maychang[/url] 电路修改后 [quote][size=2][url=forum.php?mod...
=552286][color=#5 发表于
14:47[/color][/url][/size]
这样容易使芯片温度过高吧,烧坏了[/quote]
LM2596至少也焊了一百多片了吧,就用这土办法,还真的没烧坏过。 本帖最后由 吴下阿蒙 于
23:10 编辑
这是我的板子
[quote][size=2][url...
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2210891&ptid=549466][color=#999999]刘123 发表于
16:47[/color][/url][/size]
这个是spwm[/quote]
你这个正弦波频率有差不多1kHz,可不是47.5Hz或者50Hz...
?mod=redirect&goto=findpost&pid=2213638&ptid=549459][color=#999999]xxxlzjxxx 发表于
08:47[/color][/url][/size]
锻炼吧,能有几个小伙伴一起坚持下去比较好,自己一个人就比较枯燥无聊。还有减肥什么的,三分练七分吃[/quote]
说的是,结伴而行也会比较容易坚持的下去呢...
本帖最后由 ddllxxrr 于
16:47 编辑
早晨起来就忙着测下方波怎么样,我这个是0——5V可以测的,我就测了一下我的示波器方波,也可以测。显示是一些小点,我想是示波器上的HZ太快的原固,而我的采样相对来说是慢了。
我又直接把P5_5脚让它每采十个点就换下位,于是有如下的波形:
程序原理是这样:ADC采样后由于是个小数点后三位的小数,于是,就乘以240然后...
=findpost&pid=2214057&ptid=549262][color=#999999]kukuxing 发表于
20:47[/color][/url][/size]
奥,这样的话还挺好的,射频芯片可以换。但是contiki移植到stm32好像没有官方的参考,这个挺难搞得吧,你 ...[/quote]
看官方demo
基本结构搞清楚
随便什么平台移植都不是问题
我移植过...
]苦瓜。。 发表于
13:47[/color][/url][/size]
而且感觉阶数高了后面寄生电容、电感影响很大[/quote]
楼主做的是哪一题 [quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2210575&ptid=549164][color=#999999]聪聪聪 发表于 ...
一开始的“导通”,而实际上是相当于沟道“饱和”时候的RDS了。
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2213792&ptid=548952][color=#999999]elec32156 发表于
12:47[/color][/url][/size]
谢谢前辈!
这么说可以理解为...
你可能感兴趣的标签
热门资源推荐R语言简介[1]
&&&&r语言简介r语言笔记:数据分析与绘图的编程环境版本1.7r development core team june 10, 2006 contents1 绪论与基础 1.1 r语言环境 . . . . . . . . . . . . . . . 1.2 相关的软件和文档 . . . . . . . &&&&. . . 1.3 r与统计 . . . . . . . . . . . . . . . . 1.4 r与视窗系统 . . . . . . . . . . . . . 1.5 r的交互使用 . . . . . . . . . . . . . 1.6 入门训练 . . . . . . . . . . . . . . . 1.7 获取函数和功能的帮助信息 . . . . . 1.8 r的命令、对大小写的敏感,等等 . . 1.9 对已输入命令的记忆和更改 . . . . . 1.10 命令文件的执行和输出的转向到文件 1.11 数据的保持与对象的清除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 7 7 7 8 9 10 10 11 11 112 简单操作;数值与向量 2.1 向量与赋值 . . . . . . . . . . . . . . . . . . . . . 2.2 向量运算 . . . . . . . . . . . . . . . . . . . . . . 2.3 产生规则的序列 . . . . . . . . . . . . . . . . . . . 2.4 逻辑向量 . . . . . . . . . . . . . . . . . . . . . . 2.5 缺失值 . . . . . . . . . . . . . . . . . . . . . . . . 2.6 字符向量 . . . . . . . . . . . . . . . . . . . . . . 2.7 索引向量(index vector);数据集子集的选择与修改 2.8 对象的其他类型 . . . . . . . . . . . . . . . . . . . 3 对象,模式和属性 3.1 固有属性:模式和长度 3.2 改变对象的长度 . . . . 3.3 属性的获取和设置 . . 3.4 对象的类别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 有序因子与无序因子 12 4.1 一个特例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4.2 函数tapply()与ragged数组 . . . . . . . . . . . . . . . . . . . . . . 12 4.3 有序因子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5 数组和矩阵 14 5.1 数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 5.2 数组的索引和数组的子块 . . . . . . . . . . . . . . . . . . . . . . 14 5.3 索引数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 i contents 函数array() . . . . . . . . . . . . . . . . . . . 5.4.1 向量,数组的混合运算,重复使用规则 5.5 两个数组的外积 . . . . . . . . . . . . . . . . . 5.6 数组的广义转置 . . . . . . . . . . . . . . . . . 5.7 专门的矩阵功能 . . . . . . . . . . . . . . . . . 5.7.1 矩阵乘法 . . . . . . . . . . . . . . . . 5.7.2 线性方程和矩阵的逆 . . . . . . . . . . 5.7.3 特征值和特征向量 . . . . . . . . . . . 5.8 奇异值分解与行列式 . . . . . . . . . . . . . . 5.9 最小二乘拟合及qr分解 . . . . . . . . . . . . 5.10 构建分区矩阵,cbind()和rbind() . . . . . . . 5.11 连接函数c(),针对数组的应用 . . . . . . . . . 5.12 由因子生成频数表 . . . . . . . . . . . . . . . 5.4 6 列表和数据帧 6.1 列表 . . . . . . . . . . . . 6.2 构建和修改列表 . . . . . . 6.2.1 连接列表 . . . . . 6.3 数据帧 . . . . . . . . . . . 6.3.1 创建数据帧 . . . . 6.3.2 attach()与detach() 6.3.3 使用数据帧 . . . . 6.3.4 挂接任意列表 . . . 6.3.5 管理搜索路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .ii 16 16 17 17 18 18 18 19 19 19 19 19 20 21 21 22 22 22 22 23 23 24 24 25 25 26 26 27 277 从文件中读取数据 7.1 函数read.table() . . . . . . . . . . 7.2 函数scan() . . . . . . . . . . . . . . 7.3 内建数据集的存取 . . . . . . . . . 7.3.1 从其他r功能包中载入数据 7.4 编辑数据 . . . . . . . . . . . . . .8 概率分布 28 8.1 r—作为一个统计表的集合 . . . . . . . . . . . . . . . . . . . . . . 28 8.2 检测数据集合的分布 . . . . . . . . . . . . . . . . . . . . . . . . . 29 8.3 单样本和两样本检验 . . . . . . . . . . . . . . . . . . . . . . . . . 32 9 语句组、循环和条件操作 9.1 表达式语句组 . . . . . . . . . . . . 9.2 控制语句 . . . . . . . . . . . . . . 9.2.1 条件执行:if语句 . . . . . . 9.2.2 重复执行:for 循环,repeat 10 编 写自己的函数 10.1 简单示例 . . . . . . 10.2 定义新的二元操作符 10.3 指定的参数和默认值 10.4 参数’...’ . . . . . . . 10.5 函数内的赋值 . . . . 10.6 更多高级示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 和while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 35 35 35 35 37 37 38 38 39 39 39 contents 10.6.1 区组设计的效率因子(eciency factors) 10.6.2 删除打引数组中的所有名称 . . . . . . . 10.6.3 递归的数值积分 . . . . . . . . . . . . . 10.7 范畴(scope) . . . . . . . . . . . . . . . . . . . . 10.8 定制环境 . . . . . . . . . . . . . . . . . . . . . 10.9 类别,通用函数和对象定位 . . . . . . . . . . . 11 r的统计模型 的 11.1 定义统计模型;公式 . . . . . . . . 11.1.1 对比(contrasts) . . . . . . . 11.2 线性模型 . . . . . . . . . . . . . . 11.3 用于释放模型信息的通用函数 . . . 11.4 方差分析与模型比较 . . . . . . . . 11.4.1 方差分析表(anova tables) 11.5 更新拟合模型 . . . . . . . . . . . . 11.6 广义线性模型 . . . . . . . . . . . . 11.6.1 族(families) . . . . . . . . . 11.6.2 函数glm() . . . . . . . . . . 11.7 非线性最小二乘和最大似然模型 . . 11.7.1 最小二乘 . . . . . . . . . . 11.7.2 最大似然 . . . . . . . . . . 11.8 一些非标准的模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iii 39 40 41 41 43 44 45 45 48 48 48 49 49 50 50 51 51 53 53 54 55 56 56 56 57 58 58 59 61 61 61 62 62 63 63 63 64 65 65 67 67 67 6812 图 形过程 12.1 高级绘图命令 . . . . . . . . . . . . . . . 12.1.1 函数plot() . . . . . . . . . . . . . 12.1.2 显示多元数据 . . . . . . . . . . . 12.1.3 显示图形 . . . . . . . . . . . . . 12.1.4 高级绘图函数的参数 . . . . . . . 12.2 低级绘图命令 . . . . . . . . . . . . . . . 12.2.1 数学注释 . . . . . . . . . . . . . 12.2.2 hershey 矢量字体 . . . . . . . . 12.3 图形的交互 . . . . . . . . . . . . . . . . 12.4 使用图形参数 . . . . . . . . . . . . . . . 12.4.1 持续性变更(permanent changes): 12.4.2 临时性变更:图形函数的参数 . . 12.5 图形参数列表 . . . . . . . . . . . . . . . 12.5.1 图形元素 . . . . . . . . . . . . . 12.5.2 坐标轴和标记 . . . . . . . . . . . 12.5.3 图边缘(figure margins) . . . . . 12.5.4 多图环境 . . . . . . . . . . . . . 12.6 设备驱动 . . . . . . . . . . . . . . . . . 12.6.1 文本文档的postscript图表 . . . . 12.6.2 多重图形设备 . . . . . . . . . . . 12.7 动态图形 . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . par()函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . chapter 1绪论与基础1.1 r语 言环 境 语r是一套由数据操作、计算和图形展示功能整合而成的套件。包括:
有效的数据存储和处理功能,
一套完整的数组(特别是矩阵)计算操作符,
拥有完整体系的数据分析工具,
为数据分析和显示提供的强大图形功能,
一套(源自s语言)完善、简单、有效的编程语言(包括条件、循环、自 定义函数、输入输出功能)。 在这里使用”环境”(environment)是为了说明r的定位是一个完善、统一的系 统,而非其他数据分析软件那样作为一个专门、不灵活的附属工具。 r很适合被用于发展中的新方法所进行的交互式数据分析。由于r是一个动 态的环境,所以新发布的版本并不总是与之前发布的版本完全兼容。某些用户 欢迎这些变化因为新技术和新方法的所带来的好处;有些则会担心旧的代码不 再可用。尽管r试图成为一种真正的编程语言,但是大家不要认为一个由r编写 的程序可以长命百岁。1.2相关的软件和文档r可以被当作s语言(由rick becker,john chambers和allanwilks在bell实验室 开发)的实现工具,或者s-plus系统的基本形态。 s语 言 的 发 展 变 化 可 以 参 考john chambers与 其 他 人 合 作 的 四 本 书 。 对r来说,基本的参考书是the new s language: a programming environment for data analysis and graphics(richard a. becker, john m. chambers and allan r. wilks)。 对于1991年发布的s (s version 3)可以参考statistical models in s (edited by john m. chambers and trevor j. hastie)。更多的参 考书目请查看本手册的相应部分。 此外,s-plus的相关文档都可以用于r,只是要注意r与s执行工具之间的 差别。1 chapter 1. 绪论与基础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.这个目录将作为你当前任务的工作目录. $ mkdir work $ cd work 2.启动r的程序 $ r 3.使用r的各种命令 4.退出r & q() 此时您会被询问是否保存您在r任务中的数据。你可以回答yes,no或cancel(使 用缩略字符也可以)分别对应退出前保存数据,不保存数据退出或回到r任务 中。被存储的数据在之后的r任务中可以继续使用。 之后的r任务就更简单了。1.令work成为工作目录,并启动r程序。 $ cd work $ r chapter 1. 绪论与基础32.使用r,在任务结束时用 q() 来中止。 在windows下使用r的步骤与上面基本相同。创建一个文件夹作为工作目 录,并将其设定r快捷方式的在”起始位置”中。然后双击图标启动r。1.6入门训练我们非常推荐读者们在继续进行之前通过一个示例来获取在计算机上使用r的 感觉。这个示例由示例训练给出。1.7获取函数和功能的帮助信息和unix中的man命令一样,r拥有一个内建的帮助功能。对于任意一个指定 的函数,例如solve,命令是 &help(solve) 或者 &solve 对于由特殊字符指定的功能,这些参数必须用单引号或双引号括起来,使之 成为一个“字符串”:同时对于某些含有if,for或者function的合成词也要这 样处理。 & help(&[[&) 不论是单引号还是双引号都可以包含在另一个中,例如字符串:”it’s important”。我们的惯例是使用双引号。 一般情况下帮助文档的html格式都是被安装了的,可以通过运行下面的 命令 & help.start() 启动一个web浏览器(unix下是netscape 浏览器)来浏览包含超级链接的 帮助页面。在unix下,后续的帮助请求回被发送到html为基础的帮助系统 中。页面中’search engine and keywords’连接可以通过所包含的列表对 各种函数进行非常有效的查询。这是你熟悉并且理解r提供的各种功能的好方 法。命令help.search 允许我们用多种方式来搜索帮助信息:细节和例子可以 用help.search 来查询。与某个主题相关的例子通常可以用下面的命令得到 & example(topic) windows版本的r还有另外可选的帮助系统,详细资料请用 & help 来查询。1.8r的 命令 、 对大 小 写 的敏 感, 等 等 的从技术角度来讲,r是一种表达式语言,它的语法是非常简单的。和大多 数unix为基础的软件包一样,r对大小写是敏感的,也就是说a和a是不同的 代号并且将代表不同的变量。r语言名称中可用的字符集由当前的操作系统决 定(即由locale决定)。正常情况下所有的字母和数字都是可用的(在某些国家 包括重音字符),还包括句点. ***note 1***,但是要注意名称不能以数字开 始。基本的命令由表达式或者赋值语句组成。如果一个表达式被作为一条命令 给出,它将被求值、打印而表达式的值并不被保存。一个赋值语句同样对表达 式求值之后把表达式的值传给一个变量,不过并不会自动的被打印出来。命令 由分号(;)来分隔,或者另起新行。基本命令可以由花括号( {和})合并为一组复 合表达式。注释几乎可以被放在任何地方,只要是以井号( # )开始,到行末结 chapter 1. 绪论与基础4束的都是注释。如果一个命令在行莫仍没有结束,r将会给出一个不同的提示 符,默认的是 + 在第二行和后续行r将继续读入,直到命令从语法角度讲已经输入完成了。 这个提示符也可以由用户更改。一般情况忽略继续输入提示符就行。1.9对已输入命令的记忆和更改在许多版本的unix和windows下,r提供了对已输入命令记忆和再次执行的 一种机制。使用垂直方向箭头的按键可以在命令记录中向前或向后滚动。当 一个命令用这种方法定位之后,你就可以使用左右键改变光标的位置,对命 令行进行编辑(用&del&删除或者按其他按键进行添加)。相信的资料在稍后 提供:参见命令行编辑器。记忆和编辑功能在unix下是高度可定制的。你 可以在readline 库的手册中找到具体的方法。作为选择,emacs的文本编辑 器提供了一种更为一般的支持机制(通过ess,emacs speaks statistics)来 为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的对象是很普通的。在一个单独的分析中它们的含义也会很清 晰,但是如果几个不同的分析在同一个工作目录中被处理的话你将会发现分辨 它们的含义是件很痛苦的事情。 chapter 2简单操作;数值与向量2.1 向量与赋值r对命名了的数据结构进行操作。最简单的数据结构是数字向量,数字向量是 由一组有序数字组成的单个实体。下面的r命令将创建一个名为x,包含5个数 字(10.4, 5.6, 3.1, 6.4 和21.7)的向量: & x &- c(10.4, 5.6, 3.1, 6.4, 21.7) 上面的就是一个使用函数c()的赋值过程,其中函数c()的作用是将参数中的 数值向量以及向量的值首尾相接组成一个新的向量。一个数字形成的向量可以 被看作长度为1。注意赋值操作符( - ) 不是通常的= 操作符,= 是为另外一 种目的保留的。赋值操作符由两个字符组成 (小于) 和- (减)组成,而且他们 应当严格的遵守:和-是紧靠在一起的,符号指向的是接受表达式值的那个对 象。***note 5*** 赋值的操作同样可以使用函数assign()。与上面等价的赋值方 法是: & 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 &- c(x, 0, x) 将创建一个向量y,其中的11项包含两个x和中间位置的一个0。2.2向量运算向量可以被用于算术表达式中,操作是按照向量中的元素一个一个进行的。同 一个表达式中的向量并不需要具有相同的长度。如果它们的长度不同,表达式的 结果是一个与表达式中最长向量有相同长度的向量。表达式中较短的向量会根 据它的长度被重复使用若干次(不一定是整数次),直到与长度最长的向量相匹 配。而常数很明显的将被不断重复。所以在上面的赋值前提下命令 & v &- 2*x + y + 15 chapter 2. 简单操作;数值与向量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&-10 然后比较一下这两个序列1:n-1 和1:(n-1)。30:1这 样的构造可以用来产生一个递减的序列。函数seq()可以产生更为一般的序 列。函数有5个参数,但并不是每次都要全部指定。如果给出第一个和第二个参 数,那么它们将指定序列的首尾,也就是说在只给出两个参数时函数的作用相 当于冒号。seq(2,10)也就相当于2:10。 函数seq()和其他许多r函数的参数可以指定名称的给出,此时它们出现 的次序并没有什么关系。第一二个参数的名称是from=value 和to=value,因 此seq(1,30), seq(from=1, to=30) 和seq(to=30, from=1)与1:30是相同的。seq()其 后的两个参数分别是by=value和length=value,分别指定序列的步长与长度。 如果这两个参数没有指定的话,默认的是by=1。 例如 & seq(-5, 5, by=.2) -& s3 在变量s3中产生向量c(-5.0, -4.8, -4.6, ..., 4.6, 4.8, 5.0)。相似 的 & s4 &- seq(length=51, from=-5, by=.2) 在s4中产生一个相同的向量。 第五个参数的名称是along=vector,它只能作为唯一的参数出现,产生一个 序列一个相关的函数是rep(),这个函数可以用多种复杂的方法来复制一个对 象。最简单的形式是 & s5 &- rep(x, times=5) 它将把x在s5种首尾相连的复制5次。 chapter 2. 简单操作;数值与向量72.4逻辑向量与数字向量相同,r允许对逻辑向量进行操作。一个逻辑向量的值可以是true, false,和na (not available的意思)。前两个通常简写为t 和f 。注意t 和f 仅仅 是默认被指向true和false的变量,而不是系统的保留字,因此它们可以被用 户覆盖。所以你最好还是用true 和false。逻辑向量是由条件给出的。比如 & temp &- x & 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 &- is.na(z) 需要注意逻辑表达式x==na与函数is.na(x)是不同的,因为na并不是一个 真实的值,而是一个无效量的标志。所以由于逻辑表达式本身是不完整 的,x==na是一个与x具有相同长度而其所有元素都是na的向量。另外还有一 种”缺失”值由数值运算产生,被称为not a number ,nan。例如 & 0/0 或 & inf - inf 都将返回一个nan,因为结果无法被明确的定义。函数is.na(xx)对于na和nan值 都返回true。要想区分它们的话,函数is.nan(xx)只对nan值返回true。2.6字符向量字符和字符向量在r中都被广泛的使用,比如图表的标签。在显示的时候,相 应的字符串由双引号界定,e.g.,&x-values&,&new iteration results&。 字符串在输入时可以使用单引号(’)或双以号(”),但在打印时用双引号(有时不 用引号)。r使用与c语言风格基本相同的转义符,即backslash ,所以输入\ 打印的也是\, 而引号” 在输入时应当写作&. 其它有用的转义符包括
, tab 和, 回格。字符向量可以通过函数c()连接;这样的例子会经常出现 的。函数paste()可以接受任意个参数,并从它们中逐个取出字符并连成字符 串,形成的字符串的个数与参数中最长字符串的长度相同。如果参数中包含数 字的话,数字将被强制转化为字符串。在默认情况下,参数中的各字符串是被 一个空格分隔的,不过通过参数sep=string 用户可以把它更改为其他字符串, 包括空字符串。这个函数的功能最好通过例子来理解。例如 & labs &- paste(c(&x&,&y&), 1:10, sep=&&) chapter 2. 简单操作;数值与向量8使变量labs成为字符变量 c(&x1&, &y2&, &x3&, &y4&, &x5&, &y6&, &x7&, &y8&, &x9&, &y10&) 请注意参数中比较短的字符串也要被被循环使用,因此|c(&x&,&y&)|被重 复了5次来匹配数列1:10 。2.7索 引 向 量 (index vector);数 据 集 子 集 的 选 择 与 数 修改选择一个向量中元素的子集可以通过在其名称后追加一个方括号中的索引向量 来完成。更一般的,任何结果为一个向量的表达式都可以通过追加索引向量来 选择其中的子集。这样的索引向量有四种不同的类型。 1. 逻辑的向量。在这种情况下索引向量必须与从中选取元素的向量具有相 同的长度。在索引向量中返回值是true 的元素所对应的元素将被选出, 返回值为false的值所对应的元素将被忽略。例如 & y &- x[!is.na(x)] 创建了一个名为y的对象,对象中包含x中的非缺失值,同时保持顺序。 请注意如果x中包含缺失值,y的长度将小于x。 & (x+1)[(!is.na(x)) & x&0] -& z 上面的命令创建一个对象z,其中的元素由向量x+1中与x中的非缺失值和 正数对应的向量组成。 2. 正整数的向量。这种情况下索引向量中的值必须在集合{1, 2, ...,length(x)}中。 在返回的向量中包含索引向量中指定元素,并且在结果中按照索引向量 中的顺序排列。索引向量的长度可以是任意的,返回的向量与索引向量 由相同的长度。例如x[6] 是x的第六个元素,而 & x[1:10] 选取了x的前10个元素(假设x的长度不小于10)。而 & c(&x&,&y&)[rep(c(1,2,2,1), times=4)] 产生了一个字符向量,长度为16,由 &x&, &y&, &y&, &x& 重复4次而组 成。 3. 负整数的向量。这种索引向量的作用是把某些值派出而不是包括进来。 因此 & y &- x[-(1:5)] 向量y取得了前5个元素以外的值。 4. 字符串的向量。这种可能型只存在于拥有names属性并由它来区分向量中 元素的向量。这种情况下一个由名称组成的子向量起到了和正整数的索 引向量相同的效果。 & fruit &- c(5, 10, 1, 20) & names(fruit) &- c(&orange&, &banana&, &apple&, &peach&) & lunch &- fruit[c(&apple&,&orange&)]| chapter 2. 简单操作;数值与向量9由字母和数字组成的 名称(names)比单纯的 数值索引 更好记是它最大的优 点。这个功能在使用数据框的时候非常有用,我们在后面会看到。一个被索引 的表达式。这个表达式应当有vector[index_vector]这样的形式,因为如果 在vector的位置随便放上一个表达式并没有什么意义。 & x[is.na(x)] &- 0 replaces any missing values in x by zeros and & y[y & 0] &- -y[y & 0] has the same eect as & y &- abs(y)2.8对象的其他类型向量是r中最重要的对象类型,不过在后面的章节我们还会遇到其他的几种。
矩阵(matrices) 或者更一般的说 数组 是向量在多维情况下的一般形式。 事实上它们是可以被两个或更多的指标索引的向量,并且以特定的方式 被打印出来。参见数组和矩阵
因子(factors) 提供了一种处理分类数据的更简介的方式。参见因子
列表(lists) 是向量的一种一般形式,并不需要保证其中的元素都是相同的 类型,而且其中的元素经常是向量和列表本身。列表为统计计算所返回 的结果提供了一种便捷的方式。
数据框(data frames)是一种与矩阵相似的结构,其中的列可以是不同的 数据类型。可以把数据框看作一种数据”矩阵”,它的每行是一个观测单 位,而且(可能)同时包含数值型和分类的变量。很多试验可以通过数据况 进行描述:处理是分类的和应答是数值的。参见数据框
函数(functions)是能够在r的workspace中存储的对象。我们可以通过函 数来扩展r的功能。参见编写自己的函数。 chapter 3对象,模式和属性3.1 固有属性:模式和长度r所进行操作的实体是对象。比如由实数或复数、逻辑值、字符串组成的向 量。由于它们的成分都是同一类型或者模式,所以它们可以被看作最基本的结 构,分别称为数值(实值)型(numeric),复值型(complex),逻辑型(logical)以及 字符型(character)。 向量中的值必须是相同模式的。因此任何给定的向量必定是逻辑型、数 值型、复值型或字符型中的一种。唯一一个不那么重要特例就是对无效量 的na值。请注意即使一个空向量仍然有它的模式。比如一个空的字符串向量 打印为character(0),一个空的数值向量打印为numeric(0)。 r的操作对象还包括列表,它的模式是列表型(list)。列表是对象的有序序 列,其中的元素可以是任意模式的。与最基本的结构不同的是,列表是一种”递 归”的结构,也就是说它们中的元素也可以是列表。 递归结构还包括其他的模式――函数(function)和表达式(expression)。函数 和表达式都是r系统的重要的组成部分,在后面的部分我们会深入的讨论函 数,而表达式我们只是会在公式建模部分间接的讨论到。 通过模式我们可以确定对象的基本类型。模式是对象的一种特性。对象的另 一种特性是它的长度。函数mode(object)和length(object)可以返回对象的模式 和长度。 更深入的属性可以通过attributes(object)获得,参见取得和设置属性。因 此,模式和长度也被称为对象的”固有属性”。 例如,令z是一个长度为100的复值向量,在表达式中mode(z)的值为”complex”,length(z)的 值为100。 在允许的情况下(大多数情况都是允许的),r可以完成各种模式的转换。例 如 & z &- 0:9 我们可以通过命令 & digits &- as.character(z) 将z 转化为字符向量c(&0&, &1&, &2&, ..., &9&) 后赋值给digits。我们 还可以进一步的强制转化(coercion),或称转化模式,将digits转化为数值向 量: & d &- as.integer(digits) 此时d和z是相同的。在r中存在很多类似的,形式为as.something()的函 数,可以完成从一个模式向另一个模式的转化,或者是令对象取得它当前模式10 chapter 3. 对象,模式和属性 不具有的某些属性。通过帮助文档,用户应当会对他们更加熟悉。113.2改变对象的长度一个”空”对象具有模式。例如 & e &- numeric() 产生一个模式为数值型的空向量。同样的,character()是一个字符式的空 向量等等。当一个对象被创建之后,不论对象的长度是多少,新添加的元素都 将被赋予一个索引值,这个索引值将在原有索引值范围之外。因此 & e[3] &- 17 另e为一个长度为3的向量(此时,该向量的前两个元素都是na)。这个规 则对任何结构都是有效的,新增元素的模式与对象中第一个位置的元素相同。 这种对对象长度的自动调整是经常被使用的。例如使用scan()进行输入 时。(参见) 相反的,如果要缩短(截断)一个对象的长度,只需要一个赋值命令。因 此,若alpha是一个长度为10的对象,下面的命令 & alpha &- alpha[2 * 1:5] 使之成为一个长度为5,仅包含前五个索引值为偶数的元素的对象。变换后 原有的索引值不被保留。3.3属性的获取和设置函数attributes(object)将给出当前对象所具有的所有非基本属性(长度和模 式属于基本属性)的一个列表。函数attr(object,name)可以被用来选取一个 指定的属性。除了为某些特殊的目的创建新属性这样特殊的环境下,这些函数 很少被用到,比如将一个r对象与创建日期或一个操作符相关联时。不过,这 种概念是相当重要的。 在赋予或删除属性的时候需要慎重的作些检查。因为属性是r的对象系统不 可分割的一部分。 当函数attr()用在赋值语句左侧时,既可以是将对象与一种新的属性关 联,也可以是对原有属性的更改。例如 & attr(z,&dim&) &- c(10,10) 另r将z作为一个10 × 10的矩阵看待。3.4对象的类别对象的一个特别属性,类别,被用来指定对象在r编程中的风格。 例如,如果一个对象的类别是&data.frame&,它将按照一种特定的方式被 打印出来,函数plot()在绘图时也会按照特定的方式来进行,其他被称作通用 函数的函数,例如summary()在处理时也会对它的类别作出特定的反应。 如果要临时去除类别的作用,可以使用函数unclass()。例如,如果winter的 类别为&data.frame&,那么 & winter 将按照数据帧的形式来打印它,和矩阵的形式差不多,而 & unclass(winter) 将把它按照一个普通的列表来打印。这个功能你只会在一些相当特殊的情况 下才会用到,其中一个便是当你要学习类别和通用函数的概念时。 在sec10.9我们还会再讨论通用函数和类别,不过只是简要的。 chapter 4有序因子与无序因子因子1 是一种向量对象,它给自己的组件指定了一个离散的分类(分组), 它的组件由其他等长的向量组成。r提供了有序因子和无序因子。因子的“实 际”应用是与模型公式相联系的(参见),我们在这里先看4.1一个特例假设,我们有从澳大利亚来的30个税务会计作为样本他们各自所在省份由下面 的字符向量指定 & state &- c(&tas&, &sa&, &qld&, &nsw&, &nsw&, &nt&, &wa&, &wa&, &qld&, &vic&, &nsw&, &vic&, &qld&, &qld&, &sa&, &tas&, &sa&, &nt&, &wa&, &vic&, &qld&, &nsw&, &nsw&, &wa&, &sa&, &act&, &nsw&, &vic&, &vic&, &act&) 在这里提示读者:在一个字符向量中,“排序的”是值按照字母顺序被排序。 此时用函数factor()创建一个因子 & statef &- factor(state) 函数print()对因子的处理与其它对象略有不同。 & statef [1] tas sa qld nsw nsw nt wa wa qld vic nsw vic qld qld sa [16] tas sa nt wa vic qld nsw nsw wa sa act nsw vic vic act levels: act nsw nt qld sa tas vic wa 函数levels()可以用来观察因子中有多少不同的水平。4.2函 数tapply()与 ragged数 组 与 数c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56, 61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46, 59, 46, 58, 43)继续前面的例子,假设我们拥有这些会计的收入数据 & incomes &-1 此处的有序是指其因子水平顺序是指定的,而无序则表明因子的水平没有经过处理,一般是按照字母顺序排列的,所以称有序因子为定序因子似乎更恰当。12 chapter 4. 有序因子与无序因子 此时通过函数tapply()可以计算个省份会计收入的样本均值 & incmeans &- tapply(incomes, statef, mean) 包含所得均值的向量在显示时由其水平标记 act nsw nt qld sa tas vic wa 44.500 57.333 55.500 53.600 55.000 60.500 56.000 52.25013函数tapply()的作用是对它第一个参数的组件中所包含的每个组应用一个 函数,本例中是对incomes应用函数mean(),而incomes的水平由tapply()的 第二个参数statef定义。函数的结果是一个长度与因子水平数相等的结构。上 面的例子是比较一般的情况,即incomes与statef是两个单独变量时tapply()的 应用方法。更详细的资料读者可以通过帮助文档查询。 假设我们还要进一步的对各省税务会计收入均值的标准误进行计算。我们需 要编写一个简单的r函数来计算任何给定向量的标准误。由于r内建一个计算样 本方差的函数var(),所以我们要做的只是写一个一行的函数,并通过赋值语 句指定函数的名称 & stderr &- function(x) sqrt(var(x)/length(x)) (函数的编写将在稍后的章节讲述,参见)赋值完成后我们就可以这样计算 标准误了: & incster &- tapply(incomes, statef, stderr) 所求得的值为 & incster act nsw nt qld sa tas vic wa 1.5 4. 4.6 0.5 5.244 2.6575 作为一个练习,你可能还想得到收入均值95%的置信区间。可以通过下面的 方法完成:先用tapply()应用函数length()得到样本长度,然后用函数qt()来 获得t分布的分位点。 函数tapply()可以通过多类别的方法处理更复杂的向量索引。例如,我们 可能像依据省份和性别来分割税务会计的数据,在一个简单的例子中(只有一 个类别),我们的思路可以是这样的:根据类别中不同的项,向量中的值被分 成不同的组,然后,函数被分别应用于每一个组。返回指是函数结果的向量, 由类别的水平标记。 一个向量和一个标记用的因子合并有时会成为一个ragged array,因为子类 别的大小可能是不规则的。当子类别的大小全都相同时,合并过程中会自动完 成索引,而且这样显然会更有效率,正如我们在下一章将要看到的那样。4.3有序因子因子的水平按照字母顺序存储,不过如果被明确的指定,他们将按照指定的顺 序存储。有时因子的水平具有其原始的顺序,而且这种顺序可以在我们的统计 分析中被用到,所以我们需要一定的方法来记录这种顺序。函数ordered() 可 以创建这种有序因子,但是这种有序因子同因子是有差别的。在多数情况下, 有序因子和无序因子的差别仅仅是前者在输出结果是其水平,不过在拟合线性 模型时,两种因子是有实质差异的。 chapter 5数组和矩阵5.1 数组数组可以看成一个由递增下标表示的数据项的集合,例如数值。r语言对创建 和处理数组及其特例矩阵提供了简单而方便的功能,尤其是对矩阵。 一个矩阵就是一个2维数组。维数向量中的值规定了下标k 的上限。下限一 般为1。如果一个向量需要在r中以数组的方式被处理,则必须含有一个维数向 量作为它的dim属性。 假设,例如,z是一个由1500个元素组成的向量。下面的赋值语句 & dim(z) &- c(3,5,100) 使它具有dim属性,并且将被当作一个3 × 5 × 100的数组进行处理。 在更简单和一般化的赋值过程中还可以用到像matrix()和array()这样的函 数。读者可以参考() 当数据向量中的值被赋给数组中的值时,将遵循与fortran相同的原 则—”主列顺序”,即第一个下标变化的最快,最后的下标变化最慢。 例如,一个数组a的维数向量是c(3,4,2),则它包含24个数据项,这些数据 项在数据向量中的顺序是a[1,1,1], a[2,1,1],..., a[2,4,2], a[3,4,2]。5.2数组的索引和数组的子块正如上面所提到的,数组中的单个元素可以通过下标来指定,下标由逗号分 隔,写在括号内。 更一般的,我们可以通过在下标的位置给出一个索引向量来指定一个数组的 子块,不过如果在任何一个索引位置上给出空的索引向量,则相当于选取了这 个下标的全部范围。 继续上面的例子,a[2,,]是一个4 × 2的数组,维数向量为c(4,2),数据向 量中包含下面这些值 c(a[2,1,1], a[2,2,1], a[2,3,1], a[2,4,1], a[2,1,2], a[2,2,2], a[2,3,2], a[2,4,2]) 其顺序与给出顺序的相同。 a[,,]代表了整个数组,相当于省略所有下标,单独使用a。 对任意数组,比如说z,其维数向量都可以用dim()来指代(在赋值语句的 任意一侧)。 14 chapter 5. 数组和矩阵15而且,如果一个给出的数组名称中只有一个下标或单个索引向量,那么,只 有数据向量中的相应值会被用到;这种情况下维数向量是被忽略的。不过,如 果给出的单个索引不是向量而是一个数组,就不在我们上面的讨论范围内了, 而是我们下面将要讨论的。5.3索引数组除了在任意一个下标位置使用索引向量之外,数组还可以在下标处使用索引数 组,这样可以把数值向量中不规则的一组值赋值到数组中,也可以把数组中的 一组不规则的值释放到一个向量中。 我们可以用一个矩阵的例子来解释这个过程,在有双下标索引的数组的情况 下,一个索引矩阵将包含两列和所需的行数。索引向量中的项是双下标索引数 组的行索引和列索引。假定我们有一个4 × 5的数组x,并且希望完成下面的工 作
以向量的形式释放元素x[1,3], x[2,2] 和 x[3,1]
将数组中的这些元素用0替换 此时,我们需要一个3 × 2的下标数组,请看下面的例子 & x &- array(1:20,dim=c(4,5)) # generate a 4 by 5 array. & x [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20 & i &- array(c(1:3,3:1),dim=c(3,2)) & i [,1] [,2] [1,] 1 3 [2,] 2 2 [3,] 3 1 & x[i] [1] 9 6 3 & x[i] &- 0 # replace those elements by zeros. & x [,1] [,2] [,3] [,4] [,5] [1,] 1 5 0 13 17 [2,] 2 0 10 14 18 [3,] 0 7 11 15 19 [4,] 4 8 12 16 20 & 作为一个不太重要的例子,假定,我们要为一个由因子blocks(b levels) 和varieties (v levels) 定义的区组设计生成一个设计矩阵。进一步的,我们假设实验中包 括n个计划(plot),我们可以进行如下操作: & xb &- matrix(0, n, b) & xv &- matrix(0, n, v) chapter 5. 数组和矩阵 & & & & & ib &- cbind(1:n, blocks) iv &- cbind(1:n, varieties) xb[ib] &- 1 xv[iv] &- 1 x &- cbind(xb, xv)16构建关联矩阵,比如叫n,我们可以使用 & n &- crossprod(xb, xv) 不过,构件这个矩阵,更简单直接的方法是使用函数table(): & n &- table(blocks, varieties)5.4函 数array()除了通过赋予一个向量以dim属性,我们还可以用函数array来从向量构建数 组。函数形式为 & z &- array(data_vector, dim_vector) 例如,若向量h包含24,或者更少个数值,那么命令 & z &- array(h, dim=c(3,4,2)) 将用h的数值在z中创建一个3 × 4 × 2的数组。如果h的大小恰好是24,那么命令 的效果等同于 & dim(z) &- c(3,4,2) 不过,如果h的大小小于24,它的值将被重复使用直到凑足24个。(参见)作 为一个极端但是很常见的例子 & z &- array(0, c(3,4,2)) 使e成为一个全零的数组。 此时,dim(z)代表维数向量c(3,4,2),z[1:24]代表数据向量,z[]和z都 代表整个数组。 数组可以在算数表达式中使用,结果也是一个数组,这个数组由数据向量逐 个元素的运算后组成,,通常参与运算的对象应当具有相同的dim属性。而且 这将作为最终结果的维数向量。所以如果a,b,c是相似的数组,那么 & d &- 2*a*b + c + 1 令d成为一个与数据向量相似的数组,而且很明显的,结果将是逐个元素进行 运算后得出的。不过,涉及到向量和数组混合运算的法则还需要更进一步而且 更精确的说明。5.4.1向量,数组的混合运算,重复使用规则向量,数组混合运算的精确法则会让人感觉有些怪异,而且很难在参考书中找 到。按照经验,我们发现下面的这些规则是值得信赖的一些参考。
表达式从左到右被扫描
参与运算的任意对象如果大小不足,都将被重复使用直到与其他参与运 算的对象等长
有且只有较短的向量和数组在运算中相遇时,所有的数组必须具有相 同的dim属性,或者返回一个错误。(as long as short vectors and arrays only are encountered, the arrays must all have the same dim attribute or an error results.) chapter 5. 数组和矩阵17 如果有任意参与运算的向量比参与运算的矩阵或数组长,将会产生错 误。
如果数组结构正常声称,并且没有错误或者强制转换被应用于向量上, 那么得到的结果与参与运算的数组具有相同的dim属性。5.5两个数组的外积对数组一项很重要的操作是外积,如果a,b是两个数值型数组,他们的外积是 一个数组,其维数向量由二者的维数向量连接而成(顺序与结果有关),而其 数据向量由a的数据向量与b的数据向量中所有元素的所有可能乘积组成,外积 的操作符是%o%: & ab &- a %o% b 或者 & ab &- outer(a, b, &*&) 其中的乘法操作可以由任意一个双变量的函数替代,假设我们想对函数f (x; y) = cos(y)/(1 + x2)求值,其中x, y的坐标值分别由r向量x,y提供,我们可以使用下 面的方法: & f &- function(x, y) cos(y)/(1 + x^2) & z &- outer(x, y, f) 特别的,两个普通向量的外积是一个双下标的数组(即一个矩阵,秩至多 为1)。注意,外积操作显然是不具有互换性的(即操作符左右两边互换会导致 结果的变化)。在chapter10 我们会进一步的讨论如何定义你自己的r函数。一 个 例子 : 2 × 2数 字 矩阵 的 行 列 式 数作为一个人工不过相当精巧的例子,考虑一个2 × 2矩阵[a, c, d]的行列式,其 中每项都是取值于0
9区间内的非负整数。 我们的目标是求得此区间上所有形如ad
bc的行列式的值。并通过密度图显 示每个值出现的频率高低,这相当于寻找如果行列式中每个值都是独立均匀的 选取时,其行列式值的概率分布。 一个灵巧的方法是使用函数outer() & d &- outer(0:9, 0:9) & fr &- table(outer(d, d, &-&)) & 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相同大小的数组,原 有的维被perm[j]给定的新维取代。理解这个操作最简单的方式应当是把它来 chapter 5. 数组和矩阵18当作一种广义的矩阵转置。如果a是一个矩阵(也就是一个双下标数组)由命 令 & b &- aperm(a, c(2,1)) 得到的b其实就是a的转置。对这个特定的操作,我们由一个更简单的函数t(), 所以我们还可以用b &- t(a)。5.7专门的矩阵功能如上所述,矩阵仅仅是一个双下标的数组。然而作为一个非常重要的特例, 它需要一些单独的讨论。r包含许多针对矩阵(仅对矩阵有效)的操作符和函 数。例如上面提到的矩阵转置函数t(x)。函数nrow(a)和ncol(a)分别返回矩 阵a的行数和列数。5.7.1矩阵乘法矩阵乘法的操作符为%*%。一个n × 1或1 × n的矩阵在适当的情况下显然可以作 为一个n维向量来使用。相反的,在矩阵乘法表达式中出现的向量将被自动的 转化为行向量或者列向量,而转化成何种形式取决于在表达式中哪种形式是可 乘的。(不过在后面我们会看到,这个变换并不总是毫无歧义的) 例如:a,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 &- a %*% x 之后,若只有a和b被给出,则向量x是线性方程的解。在r中 & solve(a,b) 对线性方程求解。返回x的值(可能会有一些精度上的损失),请注意, 人们很少通过solve(a)求a的逆a1 ,并在线性代数式x = a1 b中使用。因为 与solve(a,b)相比x &- solve(a) %*% b既不稳定又没有效率。 在多元计算中要使用的二次型x a1 x最好通过x %*% solve(a,x)来计算, 而不是通过计算a的逆。 chapter 5. 数组和矩阵195.7.3特征值和特征向量函数eigen(sm)返回一个对称矩阵的特征值和特征向量。这个函数的结果是由 名为values和vectors的两部分组成的列表。操作 & ev &- eigen(sm) 把这个列表赋值给ev。而ev$val和ev$vec分别是sm的特征值向量和对应的特征 向量组成的矩阵。如果只是需要特征值,我们可以使用: & evals &- eigen(sm)$values 此时evals包含特征值的向量,而第二部分则被弃用了。单独使用 & eigen(sm) 将连同名称打印列表& eigen(sm)的两部分。5.81奇异值分解与行列式5.9最 小二 乘拟 合及 qr分 解 分函数lst()返回由最小二乘拟合的结果组成的列表。形如 & ans &- lsfit(x, y) 的赋值操作返回最小二乘拟和的结果,其中y是观测值向量,x为设计矩阵, 通过帮助功能可以获得更多的详细资料,还可以获得后续函数ls.diag()的信 息,ls.diag()的功能包括回归诊断等等。请注意,一个总平均项已经默认包含 在x中,所以不必在x中再增加这一列。 另一个密切联系的函数是qr()和与它的相关函数。考虑下面的赋值 & & & & xplus &- qr(x) b &- qr.coef(xplus, y) fit &- qr.fitted(xplus, y) res &- qr.resid(xplus, y) 这些操作将分别计算y在x区间上的正交投影。5.10构建 分 区矩 阵, cbind()和 rbind() 和正如我们在前面见到的,矩阵可以由其它向量和矩阵通过函数cbind()和rbind()构 建。简单的说,cbind()按照水平方向,或者说按列的方式将矩阵连接到一 起。rbind()按照垂直的方向,或者说按行的方式将矩阵连接到一起。 在赋值语句 & x &- cbind(arg 1, arg 2, arg 3, ...) 中,cbind()的参数必须是任意长度向量或具有相同列数的5.11连接 函数 c(), 针对 数组 的应 用 ,我们应当注意下面的问题:cbind()和rbind()是考虑dim属性的连接函数,而基 础(更低级)的c()则不然,它会清除数值型对象的所有dim,dimnames属性。 在某些情况下,我们可以利用这个特性。1 奇异值分解的介绍可以参考/singularvaluedecomposition.html chapter 5. 数组和矩阵 将一个数组强制转化为一个简单向量,比较正是的方法是使用as.vector()20不过我们可以通过使用单参数的c()来达到相似的效果: 两种方法之间有些细小的差异,但是使用中对二者的选择更多的只是习惯问 题,多数倾向于前一种方法。5.12由因子生成频数表请回忆一下,一个因子可以将一个区块定义为若干个组。相似的,一对因子可 以定义一个二维的交叉分类,还可以有更多的因子。函数table()可以由等长的 因子得出相应的频数表。如果有一个k类的参数,那么结果就是一个k维的频数 数组。 例如,假定statef是一个数据向量中每一项的省份代码构成的向量,命令 将样本中各省份的频数表赋值给因子statefr,其中的频数按照类别的水平 (level)标识并排序。 这个简单的例子与 等价,但更方便易用 我们进一步假定incomef是数据向量中每一项通过cut()函数生成的”income class”构成的因子 然后计算一个二维的频数表由此可以扩展到更高维的频数表。 chapter 6列表和数据帧6.1 列表r列表是由称作组件的有序对象集合构成的对象。 对于组件,并未特定的要求他们是相同模式或类型。而且,一个列表可以同 时包含数值向量,逻辑值,矩阵,复值向量,字符数组和函数等等。下面是构 造列表的一个简单例子 & lst &- list(name=&fred&, wife=&mary&, no.children=3, child.ages=c(4,7,9))| 组件总是被 编号 的,并且可以通过编号指定。因此,如果lst是一个有 四个组件组成的列表,则其中的组件可以分别被指定为lst[[1]], lst[[2]], lst[[3]] 和lst[[4]]。更进一步的,如果lst[[4]]是一个有下标的数组,lst[[4]][1] 就是它的第一项。 如果lst是一个列表,那么函数length(lst)返回列表(最高级别)组件的 个数。列表的组件也可以是被命名的。这种情况下,组件既可以通过在双层方 括号中的给出名称的方式来指定,也可以使用下面这种更方便的形式
name$component name 来完成同样的功能。 这条规则非常有用,因为它可以让你在忘记编号的时候仍能轻松选取正确的 组件。 所以在上面那个简单的例子中, 与lst[[1]]相同,lst$name代表字符串&fred& 与lst[[2]]相同,lst$wife代表字符串&mary& 与lst[[4]][1]相同,lst$child.ages[1]代表数字4。 此外,用户还可以在双层方括号中使用列表组件的名称,比如lst[[&name&]]与lst$name等 价。这种方式在要选定的组件名称存储于另一个变量中时特别有用, & x &- &name&; lst[[x]] 请注意区分lst[[1]]和lst[1],’[[...]]’是选择单个元素时使用的操作 符,而’[...]’是一个一般的下标操作符。因此,前者代表列表lst中的第一个 对象,而且如果列表已命名,对象的名称并不包含在所指定的对象里;后者是 列表lst的子列表, 仅包含列表的第一项 。 而如果列表已命名 , 其名称也包含 到所指定的对象里。 组件的名称可以缩写,可缩写的程度是只要能令组件被唯一的识别就可以 了。因此lst$coefficients 可以缩写到lst$coe,而lst$covariance可以缩 写到lst$cov,这是在可识别前提下最短的缩写了。 21 chapter 6. 列表和数据帧22名称的向量也是列表的属性,自然也可以同样被处理。不仅是列表,其他结 构也可以包含names属性。6.2构建和修改列表新的列表可以通过list()函数从现有的对象中建立。型如 & lst &- list(name_1=object_1, . . ., name_m=object_m) 的赋值将创建一个包含m个组件的列表,并根据参数中指定的名称为其命 名。(其名称可以自由选取)。如果它们的名称被省略,组件将只是被编号。 在创建列表的过程中,所使用的组件是被复制到新的列表中的,对原始对象没 有影响。 同其他有下标对象一样,也可以通过指定额外组件的方式扩展列表。例如 & lst[5] &- list(matrix=mat)6.2.1连接列表当连接函数c()的参数为列表时,其结果也是一个模式为列表的对象。由参数 中的列表作为组件依次连接而成。 & list.abc &- c(list.a, list.b, list.c) 请回忆一下连接函数以向量 为参数时,也是将所有参数连接到一起形成一个单独的向量结构。在这种情况 下,所有其它属性,例如dim属性,都失去了6.3数据帧数据帧 是类别为”data.frame”的列表,下面对列表的限制对数据帧也有效。 组件必须是向量(数值型,字符形,逻辑型),因子,数值矩阵,列 表,或其他数据帧
矩阵,列表,数据帧向新数据帧提供的变量数分别等于它们的列数,元 素数和变量数
数值向量,逻辑值和因子在数据帧中保持不变,字符向量将被强制转化 为因子,其水平是字符向量中所出现的值。
数据帧中作为变量的向量结构必须具有相同的长度,而矩阵结构应当具 有相同的行大小 很多情况下,数据帧会被当作各列具有不同模式和属性的矩阵。数据帧按照 矩阵的方式显示,选取的行或列也按照矩阵的方式来索引。6.3.1创建数据帧那些满足对数据帧的列(组件)限制的对象可以通过函数data.frame来构建成 为一个数据帧 & accountants &- data.frame(home=statef, loot=income, shot=incomef) 如果一个列表的组件与数据帧的限制一致,这个列表就可以通过函数as.data.frame()强 制转化为一个数据帧。 创建数据帧最简单的方法应当是使用read.table()函数从外部文件中读取 整个数据帧。这将在chapter 7中讨论。 chapter 6. 列表和数据帧236.3.2attach()与 detach() 与标记$,如account$statef中的,在组件中的使用并不总是非常方便。一个有 用的功能可以使列表或数据帧的组件暂时像变量一样可见。保持它们的组件名 称,而无须每次都还引用列表名称。 函数attach()的参数既可以是一个directory name,也可以是一个数据帧。 假定lentils是含有三个变量lentils$u,lentils$v,lentils$w 的数据帧,操 作 & attach(lentils) 将数据帧置于搜索路径的位置2,而位置1上并没有变量u,v,w,这些来自数 据帧的变量仅在他们自己的权限范围内有效。此时,类似 & u &- v+w 的赋值操作并不会替代数据帧中的组件u,而是由工作目录搜 索路径位置1上的另一个变量u遮盖了。如果要对数据帧本身作永久的改变的 话,最简单的方式是求助于$标记: & lentils$u &- v+w 然而组件u的新值必须在数据帧卸载(detach)再重 新挂接(attach)之后才可见。 卸载数据使用函数 & 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这样的变量名。 chapter 6. 列表和数据帧246.3.4挂接任意列表attach()是具有一般性的函数,即它不仅能够将目录和数据帧挂接在搜索路径 上,还能挂接其他类别的对象。特别是模式为&list&的对象可以通过相同的方 式挂接: & attach(any.old.list) 任何被挂接的对象都可以用detach来卸载,通过指定位置编号或者指定名 称这样的方式。6.3.5管理搜索路径函数search将显示目前的搜索路径。所以用来跟踪已挂接或已卸载的数据帧、 列表(以及功能包)是非常有用的。 初始的结果是 & search() [1] &.globalenv& &autoloads& &package:base& 此处,.globalenv是工作区(workspace)1 当lentils被挂接后 & search() [1] &.globalenv& &lentils& &autoloads& &package:base& & ls(2) [1] &u& &v& &w& 正如我们所见ls(或objects)命令可以用来检查搜索路径任意位置上的内 容。最后,我们卸载数据帧,并且确认它们已被从搜索路径上删除。 & detach(&lentils&) & search() [1] &.globalenv& &autoloads& &package:base&1 关于第二项的含义请通过在线帮助查询autoload chapter 7从文件中读取数据通常大规模的数据对象都是从外部文件中读取值,而不是在r任务运行过程中 从键盘录入。r的输入功能比较简单,其要求相当严格,很不灵活。r的设计者 认为你完全可以通过其他的工具,例如文件编辑器和perl 1 来修改输入文件, 使之符合r的要求。一般来说,这还是很简单的。 如果变量可以通过数据帧存储,正如我们所建议的,我们就可以通过函 数read.table()直接将完整的数据帧读出。还有一个更原始的输入函数scan(), 可以直接读入。 关于r数据输入输出的详细信息请参考r data import/export 手册。7.1函 数read.table()要直接将整个数据帧读出,所用的外部文件需要符合特定的格式。
第一行应当提供数据帧中每个变量的名称
此外的每一行中包含一个行标号(必须在第一项的位置)和其它各变量 的值 如果文件的第一行所包含的项目比第二行少,也被认为是有效的。所以一个 数据帧的数据来源文件,其前几行可以是下面这样的。 包含名称和行标号的输入文件形式 price 52.00 54.75 57.50 57.50 59.75 floor 111.0 128.0 101.0 131.0 93.0 area 830 710
rooms 5 5 5 6 5 age 6.2 7.5 4.2 8.8 1.9 cent.heat no no no no yes01 02 03 04 05 ...默认情况下,数值项(出了行标号)将被当作数值变量读入。非数值变量, 如例子中的cent.heat,将被作为因子读入。如果需要的话,这个规则可以改 变。 之后,函数read.table()就可以直接读出一个数据帧了。1 在unix下可以使用sed或awk25 chapter 7. 从文件中读取数据26& houseprice &- read.table(&houses.data&) 经常的你会希望直接忽略行标号,使用系统默认的标号。在这个例子中,可 以通过下面的方式忽略行标号这列: 包含名称和行标号的输入文件形式 price 52.00 54.75 57.50 57.50 59.75 ... floor 111.0 128.0 101.0 131.0 93.0 area 830 710
rooms 5 5 5 6 5 age 6.2 7.5 4.2 8.8 1.9 cent.heat no no no no yes此时,读取数据帧可使用: & houseprice &- read.table(&houses.data&, header=true) 选项header=true说明文件的第一行是表头行,由此可知文件的格式中不包 括行标号。7.2函 数scan()假设需要平行读入等长的数据向量,进一步假定我们有3个向量,第一个的模式 为字符型,其他两个为数值型,文件为’input.dat’,首先,使用scan()函数将三 个向量以列表形式读入 & inp &- scan(&input.dat&, list(&&,0,0)) 其中第二个参数是一个名义列表结构,用来确定要读取的三个向量的模式, 存储于inp中的结果,是由三个读入的向量作为组件的列表。若要将其中的数 据项分解为三个独立向量。可以通过下面的赋值操作 & label &- inp[[1]]; x &- inp[[2]]; y &- inp[[3]] 而且在名义列表中,我们可以直接命名组件,是存取已读入向量的过程更加 方便。例如 & inp &- scan(&input.dat&, list(id=&&, x=0, y=0)) 如果希望分别存取其中的变量,你既可以将变量重新赋值到工作帧中 & label &- in$ x &- in$x; y &- in$y 也可以将列表附加到搜索路径的位置2上。(chapter 6)如果第二个参数是 单个值而不是列表,那么函数只读入单个向量,而且所有组件都应当于名义变 量保持相同的模式。 & x &- matrix(scan(&light.dat&, 0), ncol=5, byrow=true) r也拥有更复杂的输入功能,详细资料可以在提供的手册中查到。7.3内建数据集的存取r本身提供超过50个数据集,同时在功能包(包括标准功能包)中附带更多的 数据集。与s-plus不同,这些数据即必须通过data函数载入。我们可以通过 data() 获得基本系统提供的数据集列表,然后通过形如 data(infert) 来载入名为infert的数据集。 chapter 7. 从文件中读取数据27多数情况下会有一个具有相同名称的r对象被载入,一般是一个数据帧。不 过,少数情况下会由若干个对象被载入。此时最好察看关于这个对象的在线帮 助,以确定可能发生的情况。7.3.1从 其 他r功 能 包 中载 入 数 据 功要存取其他功能包中的数据,可以使用package参数,例如 data(package=&nls&) data(puromycin, package=&nls&) 如果某个功能包已经由函数library()挂接了,那么它的数据集也自动的包 含在了搜索路径中。所以 library(nls) data() data(puromycin) 将列出当前已挂接的所有数据集(至少包含base和nls)。并且从第一个能 够找到puromycin的功能包中载入这个数据集。 用户发布的功能包是一个丰富的数据集来源。7.4编辑数据在使用一个数据帧或矩阵时,edit提供一个独立的工作表式编辑环境。对已读 入的数据集做小改动,它还是很有用的。命令 & xnew &- edit(xold) 允许你对数据集xold进行编辑。并在完成时将改动后的对象赋值给xnew 使用 & xnew &- edit(data.frame()) 可以通过工作表介面录入新数据。 chapter 8概率分布8.1 r—作为 一个 统 计表 的集 合 作r一个很方便的用处是提供了一套完整的统计表集合。函数可以对累积分布函 数p (x ≤ x),概率密度函数,分位函数(对给定的q,求满足p (x ≤ x) & q的 最小x)求值,并根据分布进行模拟。 distribution r name additional arguments beta beta shape1, shape2, ncp binomial binom size, prob cauchy cauchy location, scale chi-squared chisq df, ncp exponential exp rate f f df1, df1, ncp gamma gamma shape, scale geometric geom prob hypergeometric hyper m, n, k log-normal lnorm meanlog, sdlog logistic logis location, scale negative binomial nbinom size, prob normal norm mean, sd poisson pois lambda student’s t t df, ncp uniform unif min, max weibull weibull shape, scale wilcoxon wilcox m, n 对于所给的名称,加前缀’d’代表密度(density),’p’代表cdf,’q’代表分位 函数,’r’代表模拟(随即散布)。这几类函数的第一个参数是有规律的,形 为dxxx的函数为x,pxxx的函数为q,qxxx的函数为p,rxxx的函数为n(rhyper 和rwilcox是特例,他们的第一个参数为nn)。目前为止,非中心参数(noncentrality parameter)仅对cdf和少数几个其他函数有效,细节请参考在线帮 助。 所有pxxx和qxxx的函数都具有逻辑参数lower.tail和log.p,而所有的dxxx函 数都有参数log,这个是我们可以直接通过 - pxxx(t, ..., lower.tail = false, log.p = true) 获取,比如说,累积失效函数(cumulative/integrated hazard function),h(t) =28 chapter 8. 概率分布29 log(1
f (t)),以及更精确的对数似然(通过dxxx(..., log = true))。 此外,对于来自正态分布,具有学生化样本区间的分布还有ptukey和qtukey这 样的函数。下面是一些例子 & & & & ## 2-tailed 2*pt(-2.43, ## upper 1% qf(0.99, 2, p-value for t distribution df = 13) point for an f(2, 7) distribution 7)8.2检测数据集合的分布对于给定的(单变量)数据集合我们有许多方法检测其分布情况。最简单的方 法是检测数值。函数summary和fivenum这两个函数可以分别给出两个有轻微差 异的摘要,函数stem可以将数值显示出来(茎叶图”stem and leaf” plot) & data(faithful) & attach(faithful) & summary(eruptions) min. 1st qu. median mean 3rd qu. max. 1.600 2.163 4.000 3.488 4.454 5.100 & fivenum(eruptions) [1] 1.5 4.5 5.1000 & stem(eruptions) the decimal point is 1 digit(s) to the left of the | 16 |
18 | 888 20 |
| 3578 24 | 00228 26 | 23 28 | 080 30 | 7 32 | 2337 34 |
38 | 5577 40 |
| 77778 44 |
48 | 00333 50 | 0370 茎叶图看起来有些像直方图,r中绘制直方图的函数为hist。 & hist(eruptions) ## make the bins smaller, make a plot of density & hist(eruptions, seq(1.6, 5.2, 0.2), prob=true) & lines(density(eruptions, bw=0.1)) & rug(eruptions) # show the actual data points chapter 8. 概率分布30通过命令density我们可以获得更漂亮的密度图。在这个例子中我们还 通过density绘制了一条密度曲线。由于默认方式平滑的有些过度(通常在“有 趣”的密度中1 ),带宽bw是通过试错(trial-and-error)的方式确定的(在mass和kernsmooth功 能包中提供了自动选择带宽的方法和实现工具)。histogram of eruptions0.7 density 0.0 1.5 0.1 0.2 0.3 0.4 0.5 0.62.02.53.03.54.04.55.0eruptions我们可以通过标准功能包stepfun中的函数ecdf绘制经验累积分布函数。 & library(stepfun) & plot(ecdf(eruptions), do.points=false, verticals=true) 显然,这个分布与任何标准分布相距甚远。那么右边的情况怎么样呢,也就 是eruption大于3的部分。我们拟和一个正态分布,覆盖拟合cdf。 & & & & long &- eruptions[eruptions & 3] plot(ecdf(long), do.points=false, verticals=true) x &- seq(3, 5.4, 0.01) lines(x, pnorm(x, mean=mean(long), sd=sqrt(var(long))), lty=3)ecdf(long)1.0 fn(x) 0.0 0.2 0.4 0.6 0.83.03.54.0 x4.55.0quantile-quantile (q-q) 图有助于我们更细致的检测其分布形态1 原文括号中是itusually does for “interesting”densities chapter 8. 概率分布 par(pty=&s&) qqnorm(long); qqline(long)31可以看出这个分布与一个正态分布基本相符,但是右尾稍短,我们可以将它 与t分布产生的模拟数据进行比较normal qq plotsample quantiles3.03.54.04.55.021012theoretical quantilesx &- rt(250, df = 5) qqnorm(x); qqline(x) 可以看到,这个随机样本的尾部要比正态数据所预期的长。我们可以通过 qqplot(qt(ppoints(250), df=5), x, xlab=&q-q plot for t dsn&) qqline(x) 产生分布并绘制q-q图。 最后,我们可能希望一种更正式的检验来判断数据的正态性。功能包ctest中 提供了shapiro-wilk检验: & library(ctest) & shapiro.test(long) shapiro-wilk normality test data: long w = 0.9793, p-value = 0.01052 和kolmogorov-smirnov检验: & ks.test(long, &pnorm&, mean=mean(long), sd=sqrt(var(long))) one-sample kolmogorov-smirnov test data: long d = 0.0661, p-value = 0.4284 alternative hypothesis: two.sided (请注意,由于我们从相同样本中估计正态分布的参数,所以分布理论在此 是无效的。) chapter 8. 概率分布328.3单样本和两样本检验目前我们已经将一个样本与一个正态分布进行了比较。一个更一般的操作是对 两个样本的各方面进行比较。请注意,在r中,所有“经典”检验,包括我们 在下面所用到的,都包含在功能包ctest中,为了使这些检验可用,有时需要通 过library(ctest)从外部载入这个功能包。 考虑下面关于冰熔解放热(cal/gm)的数据,数据来自rice(1995,p.490) method a: 79.98 80.04 80.02 80.04 80.03 80.03 80.04 79.97 80.05 80.03 80.02 80.00 80.02 method b: 80.02 79.94 79.98 79.97 79.97 80.03 79.95 79.97 箱线图(盒子图box-plot)为两个样本提供了一个简单的图形比较方式: a &- scan() 79.98 80.04 80.02 80.04 80.03 80.03 80.04 79.97 80.05 80.03 80.02 80.00 80.02 b &- scan() 80.02 79.94 79.98 79.97 79.97 80.03 79.95 79.97 boxplot(a, b) 这表明第一组的结果似乎高于第二组79.9479.9679.9880.0080.0280.0412要检验两样本的均值是否相等。我们可以使用不配对的t-检验 & t.test(a, b) welch two sample t-test data: a and b t = 3.2499, df = 12.027, p-value = 0.00694 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: chapter 8. 概率分布 0.. sample estimates: mean of x mean of y 80.7533在正态假设下,结果显示出显著的差异,在默认的情况下,r的函数并不假 定两个样本是等方差的(与s-plus中的t.test函数相反)我们可以再正态总体的 假定下,使用f检验来判断样本方差是否相等 & var.test(a, b) f test to compare two variances data: a and b f = 0.5837, num df = 12, denom df = 7, p-value = 0.3938 alternative hypothesis: true ratio of variances is not equal to 1 95 percent confidence interval: 0..1052687 sample estimates: ratio of variances 0.5837405结果显示,没有充足的证据说明方差有显著的差异。所以我们可以使用假定 方差相等的经典t-检验。 & t.test(a, b, var.equal=true) two sample t-test data: a and b t = 3.4722, df = 19, p-value = 0.002551 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: 0.. sample estimates: mean of x mean of y 80.75 所有的这些检验都基于两个样本的正态性。两样本的wilcoxon(或mannwhitney)检验在零假设(null hypothesis)下仅仅假定分布是连续的。 & wilcox.test(a, b) wilcoxon rank sum test with continuity correction data: a and b w = 89, p-value = 0.007497 alternative hypothesis: true mu is not equal to 0 chapter 8. 概率分布34warning message: cannot compute exact p-value with ties in: wilcox.test.default(a, b) 请注意警告信息,在样本中存在打结的现象,这意味着数据来自一个离散分 布(可能由于截尾造成)。 通过图形方式比较两个样本由几种方法。我们已经见过一组箱线图的方式, 下面的: & library(stepfun) & plot(ecdf(a), do.points=false, verticals=true, xlim=range(a, b)) & plot(ecdf(b), do.points=false, verticals=true, add=true) 将显示两个经验cdf,而qqplot将显示一个两样本的q-q图。 kolmogorov-smirnov检验在一般连续分布的假设下计算两个ecdf之间垂直距 离的最大值 & ks.test(a, b) two-sample kolmogorov-smirnov test data: a and b d = 0.5962, p-value = 0.05919 alternative hypothesis: two.sided warning message: cannot compute correct p-values with ties in: ks.test(a, b) chapter 9语句组、循环和条件操作9.1 表达式语句组r是一种表达式语言,也就是说其命令类型只有函数或表达式,并由它们返回 一个结果。甚至,赋值也是一个表达式,只不过其结果是一个被赋值的值,只 要可以使用表达式的地方都可以使用赋值;包括多重赋值。 命令可以通过花括号来分组,expr 1; . . . ; expr m,此时这组语句的结果是 组中最后一个能返回值的语句的结果。因此,这样一组语句也可以作为一个表 达式,比如将其自身放在花括号中,作为一个更大的表达式的组成部分等等。9.29.2.1控制语句条 件 执行 : if语句 语r语言中条件结构的形式为 & if (expr_1) expr_2 else expr_3 其中expr 1 必须返回一个逻辑值,之后整个表达式的结果就是显而易见的 了。 操作符&&和||经常被用于if语句的条件部分中,分别代表逻辑与和逻辑 或。而&和|与&&,||的区别在于,&和|按照逐个元素的方式进行计算,&&和||对 向量的第一个元素进行运算,只有在必需的时候才对第二个参数求值。 if/else结构的向量版本是函数ifelse,其形式为ifelse (condition,a,b), 产生函数结果的规则是:如果condition[i]为真,对应a[i]元素;

我要回帖

更多关于 多项式的次数 的文章

 

随机推荐