《R语言编程艺术》——2.4 常用的向量运算

2.4 常用的向量运算

接下来将介绍一些常用的向量运算,包括算术和逻辑运算、向量索引以及一些创建向量的有用方法。然后将给出两个使用这些运算的扩展案例。
2.4.1 向量运算和逻辑运算
记住R是一种函数式语言,它的每一个运算符,包括下例中的+,实际上也是函数。

再回顾一次,标量实际上是一元向量,因此向量也可以相加,+算子按元素逐一进行运算。

如果你熟悉线性代数,当将两个向量相乘时,你也许会对所发生的感到惊讶。

但请记住,由于*函数的使用方式,实际上是元素和元素相乘。上例结果中的第一个元素5,是x的第一个元素1,与c(5,0,-1)中第一个元素5相乘的结果,以此类推。
同样的道理适用于其他数值运算符。下面有一个例子:

2.4.2 向量索引
R中最重要和最常用的一个运算符是索引,我们使用它来选择给定向量中特定索引的元素来构成子向量。索引向量的格式是向量1[向量2],它返回的结果是,向量1中索引为向量2的那些元素。

像这样的情况,使用length()函数通常很有用。例如,假设我们想选择向量z中除最后一个元素外的其他全部元素。以下代码可以实现:

对于上例,更常用的方法是z[1:2]。我们的程序可能需要处理长于二元的向量,此时第二种方法就更为通用。
2.4.3 用:运算符创建向量
R中有一些运算符在创建向量时十分有用。我们从第1章介绍过的冒号运算符:开始。它生成指定范围内数值构成的向量。

在表达式1:i-1中,冒号运算符的优先级高于减号,因此先计算1:i,得到1:2,然后再减1。这意味着二元向量减去一元向量。这就要用到循环补齐,一元向量(1)将扩展为(1,1),与二元向量1:2的长度匹配。按元素逐一相减,得到结果(0,1)。
另一方面,在表达式1:(i-1)中,括号的优先级高于减号。也就是说,先计算出i-1,表达式最终结果为1:1,也就是上例所看到的结果。
注意 在命令窗口中输入?Syntax,可以 从R自带的帮助文件里获得运算符优先级的详细说明。
2.4.4 使用seq()创建向量
比:运算符更为一般的函数是seq()(由sequence得来),用来生成等差序列。例如,鉴于3:8生成向量(3,4,5,6,7,8),其元素间隔为1(4-3=1,5-4=1,以此类推),用seq()函数可以生成间隔为3的向量,如下所示:

可以看到,如果x非空,seq(x)与1:length(x)的结果相同,但如果x为空,seq(x)正确地计算出空值NULL,导致上面的循环迭代0次。
2.4.5 使用rep()重复向量常数
rep()(由repeat得出)函数让我们可以方便地把同一常数放在长向量中。调用的格式是rep(x, times),即创建times*length(x)个元素的向量,这个向量由是x重复times次构成。例如:

rep()函数还有一个参数each,与times参数不同的是,它指定x交替重复的次数。

时间: 2024-08-02 02:25:13

《R语言编程艺术》——2.4 常用的向量运算的相关文章

《R语言编程艺术》——3.5 向量与矩阵的差异

3.5 向量与矩阵的差异 在本章开始的时候,我说过矩阵就是一个向量,只是多了两个属性:行数和列数.这里,我们再深入说明这个问题.考虑以下例子: 因为z是向量,因此我们可以求它的长度: 换句话说,从面向对象编程的角度说,矩阵类(matrix class)是实际存在的.如第1章所说,R的大部分类都是S3类,用$符号就可访问其各组件.矩阵类有一个dim属性,是一个由矩阵的行数和列数组成的向量.本书第9章讲详细介绍关于类的更多细节问题. 以用dim()函数访问dim属性: 这些其实都是对dim函数的一个

《R语言编程艺术》——2.11 向量元素的名称

2.11 向量元素的名称 可以给向量元素随意指定名称.例如,假设有一个50个元素组成的向量,表示美国每个州的人口.可以用州的名称给每个元素命名,如"Montana"和"New Jersey".也可以给图形里的点命名,以此类堆.可以用name()函数给向量中的元素命名,或查询向量元素的名称. 把向量元素名称赋值为NULL,可以将其移除.

《R语言编程艺术》——导读

前言 R是一种用于数据处理和统计分析的脚本语言,它受到由AT&T实验室开发的统计语言S的启发,且基本上兼容于S语言.S语言的名称代表统计学(statistics),用来纪念AT&T开发的另一门以一个字母命名的编程语言,这就是著名的C语言.后来一家小公司买下了S,给它添加了图形用户界面并命名为S-Plus. 由于R是免费的,而且有更多的人贡献自己的代码,R语言变得比S和S-Plus更受欢迎.R有时亦称为GNU S,以反映它的开源属性.(GNU项目是开源软件的一个重要集合.) 为什么在统计工作

《R语言编程艺术》——1.3 函数入门

1.3 函数入门 和大多数编程语言一样,R语言编程的核心是编写"函数".函数就是一组指令的集合,用来读取输入.执行计算.返回结果.我们先定义一个函数oddcount(),以此简单介绍函数的用法.这个函数的功能是计算整数向量中奇数的个数.一般情况下,我们会用文本编辑器编写好函数代码并保存在文件中,不过在这个简单粗略的例子中,我们只需要在R的交互模式中一行行输入代码.接下来,我们还会在几个测试案例中调用这个函数: 首先,我们告诉R想定义一个名为oddcount的函数,该函数有一个参数x.左

《R语言编程艺术》——2.12 关于c()的更多内容

2.12 关于c()的更多内容 在本节中,我们将讨论与连接函数c()相关的一些其他内容,有时经常用到.如果传递到c()中的参数有不同的类型,则它们将被降级为同一类型,该类型最大限度地保留它们的共同特性,如下所示: 在第一个例子中,我们混合了整数型和字符型,R会选择把它们都转换为后者的类型.在第二个例子中,对于混合的表达式,R认为列表类型有较低的优先级.本书4.3节将对这一点作深入探讨.你可能不会写如此组合的代码,但你可能会遇到发生这种情况的代码,因此理解它的效果显得尤为重要.另一个需要注意的关键

《R语言编程艺术》——1.4 R语言中一些重要的数据结构

1.4 R语言中一些重要的数据结构 R有多种数据结构.本节将简单介绍几种常用的数据结构,使读者在深入细节之前先对R语言有个大概的认识.这样,读者至少可以开始尝试一些很有意义的例子,即使这些例子背后更多的细节还需要过一段时间才能揭晓.1.4.1 向量,R语言中的战斗机 向量类型是R语言的核心.很难想象R语言代码或者R交互式会话可以一点都不涉及向量. 向量的元素必须属于某种"模式"(mode),或者说是数据类型.一个向量可以由三个字符串组成(字符模式),或者由三个整数元素组成(整数模式),

《R语言编程艺术》——2.9 向量化的ifelse()函数

2.9 向量化的ifelse()函数 除了多数语言中常见的if-then-else结构,R还有一个向量化的版本:ifelse()函数.它的形式如下: 其中b是一个布尔值向量,而u和v是向量. 该函数返回的值也是向量,如果b[i]为真,则返回值的第i个元素为u[i],如果b[i]为假,则返回值的第i个元素为v[i].这一概念相当抽象,因此我们看一个例子: 在这里,我们希望产生一个向量,这个向量在x中对应元素为偶数的位置取值是5,且在x中对应元素为奇数的位置取值12.因此,对应到形式参数b的实际参数

《R语言编程艺术》——第2章 2.0 向量

第2章 2.0 向量 R语言最基本的数据类型是向量(vector).第1章已经给出了向量的一些例子,本章将详细介绍向量.首先考察向量与R语言的其他数据类型之间的关系.与C语言家族不同,R语言中,单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例.而另一方面,R语言中矩阵是向量的一种特例,这一点与C语言家族相同.接下来我们会用大量时间关注以下话题:循环补齐:在一定情况下自动延长向量.筛选:提取向量子集.向量化:对向量的每一个元素应用函数.这些运算是R编程的核心,在本书的其他部分也会经常提

《R语言编程艺术》——2.1 标量、向量、数组与矩阵

2.1 标量.向量.数组与矩阵 在许多编程语言中,向量与标量(即单个数值)不同.例如,考虑下面的C代码: 这段代码请求编译器给一个x的整型变量x分配空间,并给一个名为y的三元素整型数组(C语言中的术语,类似于R中的向量)分配内存空间.但在R中,数字实际上被当做一元向量,因为数据类型里没有标量.R语言中变量类型称为模式(mode).回顾第1章,同一向量中的所有元素必须是相同的模式,可以是整型.数值型(浮点数).字符型(字符串).逻辑型(布尔逻辑).复数型等等.如果在程序中查看变量x的类型,可以调用