CHAPTER2.简单操作:数值与向量 2.4逻辑向量 与数字向量相同,R允许对逻辑向量进行操作。一个逻辑向量的值可以是TRUE, FALSE和MA( not available的意思)。前两个通常简写为T和F。注意T和F仅仅 是默认被指向TRUE和 FALSE的变量,而不是系统的保留字,因此它们可以被用 户覆盖。所以你最好还是用TRUE和 FALSE。逻辑向量是由条件给出的。比如 令temp成为一个与x长度相同,相应位置根据是否与条件相符而由TRUE或 FALSE组 成的向量。逻辑操作符包括<,<=,>,>=,完全相等=和不等于!=。此外, 如果c1和c2时逻辑表达式,那么c1&c2是它们的交集("and”),c1c2是 它们的并集("or”),而!c1是c1的反面。逻辑向量可以在普通的运算中被使 用,此时它们将被转化为数字向量, FALSE当做0而TRUE当做1。不过,有些情 况下逻辑向量和它们对应的数值并不是等价的,相关的例子参见下部分 2.5缺失值 某些情况下一个向量的成分并不全是已知的。当某个元素或者数值从统计角 度讲是”不可用”(" not available”)或者”缺失值”(" missing value”)时,它们在向 量中的位置将被保留,同时被赋值为一个特殊值MA。一般来讲一个NA的任何操 作都将返回NA。这条规则的出发点是如果一个操作的具体要求不够完整,是不 能得出结果的,因此是无效的。函数isna(x)返回一个逻辑向量,这个向量 与x有相同的长度,并且由相应位置的元素是否是MA来决定这个逻辑向量相应 位置的元素是TRUE还是 FALSE。 >z<-c(1: 3, NA): ind < is na(z) 需要注意逻辑表达式x==NA与函数isna(x)是不同的,因为NA并不是一个 真实的值,而是一个无效量的标志。所以由于逻辑表达式本身是不完整 的,x=NA是一个与x具有相同长度而其所有元素都是MA的向量。另外还有一 种”缺失”值由数值运算产生,被称为 Not a Number,Nal。例如 >0/0 Inf - Inf 都将返回一个NaN,因为结果无法被明确的定义。函数is.na(xx)对于NA和NaN值 都返回TRUE。要想区分它们的话,函数 is. nan(xx)只对MaN值返回TRUE 26字符向量 字符和字符向量在R中都被广泛的使用,比如图表的标签。在显示的时候,相 应的字符串由双引号界定,e.g,"x- values"," New iteration results"。 字符串在输入时可以使用单引号()或双以号("),但在打印时用双引号(有时不 用引号)。R使用与C语言风格基本相同的转义符,即 backslash,所以输入\\ 打印的也是,而引号”在输入时应当写作\".其它有用的转义符包括\n,换行 t,tab和\b,回格。字符向量可以通过函数c()连接:这样的例子会经常出现 的。函数 paste()可以接受任意个参数,并从它们中逐个取出字符并连成字符 串,形成的字符串的个数与参数中最长字符串的长度相同。如果参数中包含数 字的话,数字将被强制转化为字符串。在默认情况下,参数中的各字符串是被 个空格分隔的,不过通过参数sep= string用户可以把它更改为其他字符串 包括空字符串。这个函数的功能最好通过例子来理解。例如 >1abs<- paste(c("x","Y"),1:10,sep="")
CHAPTER 2. 简单操作;数值与向量 7 2.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 ,所以输入\\ 打印的也是\\, 而引号” 在输入时应当写作\". 其它有用的转义符包括\n, 换行, \t, tab 和\b, 回格。字符向量可以通过函数c()连接;这样的例子会经常出现 的。函数paste()可以接受任意个参数,并从它们中逐个取出字符并连成字符 串,形成的字符串的个数与参数中最长字符串的长度相同。如果参数中包含数 字的话,数字将被强制转化为字符串。在默认情况下,参数中的各字符串是被 一个空格分隔的,不过通过参数sep=string 用户可以把它更改为其他字符串, 包括空字符串。这个函数的功能最好通过例子来理解。例如 > labs <- paste(c("X","Y"), 1:10, sep="")
CHAPTER2.简单操作:数值与向量 使变量labs成为字符变量 ("X1","Y2","X3","Y4","X5","Y6","X7","Y8","X9","Y10") 请注意参数中比较短的字符串也要被被循环使用,因此lc("x","Y")|被重 复了5次来匹配数列1:10 27索引向量( index vector);数据集子集的选择与 修改 选择一个向量中元素的子集可以通过在其名称后追加一个方括号中的索引向量 来完成。更一般的,任何结果为一个向量的表达式都可以通过追加索引向量来 选择其中的子集。这样的索引向量有四种不同的类型 1.逻辑的向量。在这种情况下索引向量必须与从中选取元素的向量具有相 同的长度。在索引向量中返回值是TRUE的元素所对应的元素将被选出, 返回值为 FALSE的值所对应的元素将被忽略。例如 <-x[!is na(x)] 创建了一个名为y的对象,对象中包含x中的非缺失值,同时保持顺序 请注意如果x中包含缺失值,y的长度将小于x。 >(x+1)[(!is.na(x))&x>0]->z 上面的命令创建一个对象z,其中的元素由向量x+1中与x中的非缺失值和 正数对应的向量组成。 2.正整数的向量。这种情况下索引向量中的值必须在集合{1,2,,1 ength(x)}中。 在返回的向量中包含索引向量中指定元素,并且在结果中按照索引向量 中的顺序排列。索引向量的长度可以是任意的,返回的向量与索引向量 由相同的长度。例如x[6]是x的第六个元素,而 选取了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")JI
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")]|
CHAPTER2.简单操作:数值与向量 由字母和数字组成的名称( names)比单纯的数值索引更好记是它最大的优 点。这个功能在使用数据框的时候非常有用,我们在后面会看到。一个被索引 的表达式。这个表达式应当有 vector[ index vector]这样的形式,因为如果 在 vector的位置随便放上一个表达式并没有什么意义 >x[is.na(x)]<-0 places any missing values in x by zeros and yy<0]<--y[y<0 has the same effect as >y<-abs(y) 28对象的其他类型 向量是R中最重要的对象类型,不过在后面的章节我们还会遇到其他的几种 ·矩阵( matrices)或者更一般的说数组是向量在多维情况下的一般形式。 事实上它们是可以被两个或更多的指标索引的向量,并且以特定的方式 被打印出来。参见数组和矩阵 ·因子 factors)提供了一种处理分类数据的更简介的方式。参见因子 ·列表(ists)是向量的一种一般形式,并不需要保证其中的元素都是相同的 类型,而且其中的元素经常是向量和列表本身。列表为统计计算所返回 的结果提供了一种便捷的方式。 ·数据框( data frames是一种与矩阵相似的结构,其中的列可以是不同的 数据类型。可以把数据框看作一种数据”矩阵”,它的每行是一个观测单 位,而且(可能)同时包含数值型和分类的变量。很多试验可以通过数据况 进行描述处理是分类的和应答是数值的。参见数据框 ·函数/ functions)是能够在R的 workspace中存储的对象。我们可以通过函 数来扩展R的功能。参见编写自己的函数
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 effect 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() R的操作对象还包括列表,它的模式是列表型(it)。列表是对象的有序序 列,其中的元素可以是任意模式的。与最基本的结构不同的是,列表是一种”递 归”的结构,也就是说它们中的元素也可以是列表 递归结构还包括其他的模式一一函数( unction)和表达式( expression)。函数 和表达式都是R系统的重要的组成部分,在后面的部分我们会深入的讨论函 数,而表达式我们只是会在公式建模部分间接的讨论到 通过模式我们可以确定对象的基本类型。模式是对象的一种特性。对象的另 种特性是它的长度。函数mode( object)和 length( object)可以返回对象的模式 和长度 更深入的属性可以通过 attributes( object)获得,参见取得和设置属性。因 此,模式和长度也被称为对象的”固有属性”。 例如,令z是一个长度为100的复值向量,在表达式中 de(z)的值为” complex”, length(z)的 值为100。 在允许的情况下(大多数情况都是允许的),R可以完成各种模式的转换。例 >z<-0:9 我们可以通过命令 digits <-as character() 将z转化为字符向量c("0","1","2", "9")后赋值给 digits。我们 还可以进一步的强制转化( coercion),或称转化模式,将 digits转化为数值向 > d <-as integer(digits) 此时d和z是相同的。在R中存在很多类似的,形式为 as something的函 数,可以完成从一个模式向另一个模式的转化,或者是令对象取得它当前模式
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
CHAPTER3.对象,模式和属性 不具有的某些属性。通过帮助文档,用户应当会对他们更加熟悉 32改变对象的长度 个”空”对象具有模式。例如 >e<- numericO 产生一个模式为数值型的空向量。同样的, character()是一个字符式的空 向量等等。当一个对象被创建之后,不论对象的长度是多少,新添加的元素都 将被赋予一个索引值,这个索引值将在原有索引值范围之外。因此 [3]<-17 e为一个长度为3的向量(此时,该向量的前两个元素都是NA)。这个规 则对任何结构都是有效的,新增元素的模式与对象中第一个位置的元素相同 这种对对象长度的自动调整是经常被使用的。例如使用scan(进行输入 时。(参见) 相反的,如果要缩短(截断)一个对象的长度,只需要一个赋值命令。因 此,若a1pha是一个长度为10的对象,下面的命令 alpha < alpha[2 1: 5 使之成为一个长度为5,仅包含前五个索引值为偶数的元素的对象。变换后 原有的索引值不被保留。 属性的获取和设置 函数 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(在处理时也会对它的类别作出特定的反应。 如果要临时去除类别的作用,可以使用函数 unclasp()。例如,如果 winter的 类别为"data. frame",那么 winter 将按照数据帧的形式来打印它,和矩阵的形式差不多,而 unclass (winter) 将把它按照一个普通的列表来打印。这个功能你只会在一些相当特殊的情况 下才会用到,其中一个便是当你要学习类别和通用函数的概念时。 在sec10.9我们还会再讨论通用函数和类别,不过只是简要的
CHAPTER 3. 对象,模式和属性 11 不具有的某些属性。通过帮助文档,用户应当会对他们更加熟悉。 3.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我们还会再讨论通用函数和类别,不过只是简要的