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

简介: 本节书摘来自华章计算机《R语言编程艺术》一书中的第2章,第2.1节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.1 标量、向量、数组与矩阵

在许多编程语言中,向量与标量(即单个数值)不同。例如,考虑下面的C代码:

image

这段代码请求编译器给一个x的整型变量x分配空间,并给一个名为y的三元素整型数组(C语言中的术语,类似于R中的向量)分配内存空间。但在R中,数字实际上被当做一元向量,因为数据类型里没有标量。
R语言中变量类型称为模式(mode)。回顾第1章,同一向量中的所有元素必须是相同的模式,可以是整型、数值型(浮点数)、字符型(字符串)、逻辑型(布尔逻辑)、复数型等等。如果在程序中查看变量x的类型,可以调用函数typeof(x)进行查询。
不同于ALGOL家族的编程语言(比如C和Python)中的向量索引,R中向量索引从1开始。
2.1.1 添加或删除向量元素
与C语言类似,R中向量是连续存储的,因此不能插入或删除元素,而这跟Python语言中的数组不同。在R中,向量的大小在创建时已经确定,因此如果想要添加或删除元素,需要重新给向量赋值。
例如,把一个元素添加到一个四元向量的中间,如下代码所示:

image
image

在这里,我们创建了一个四元向量,赋值给x。为了在其第三和第四元素之间插入一个新的元素168,我们把x的前三个元素、168和x的第四个元素按顺序连起来,这样就创建出新的五元向量,而此时x并没发生变化。接下来再把这个新的向量赋值给x。
这一结果看似已经改变了x中存储的向量,但实际上创建了新的向量并把它存储到x。这样的区别看上去可能微乎其微,但它是有影响的。例如,在某些情况下,它可能限制R的快速执行的潜力,这一问题将在第14章讨论。
注意 对于C语言背景的读者来讲,x本质上是一个指针,重赋值是通过将x指向新向量的方式实现的。
2.1.2 获取向量长度
可以使用函数length()获得向量的长度。
image

在本例中,我们已经知道x的长度,所以实际上没有必要查询它。但在写一般函数的代码时,经常需要知道向量参数的长度。
例如,假设我们想要这样一个函数,用它判断其向量参数(假设存在这个值)中第一个1所在位置的索引值。下面是一种(不一定有效率的)代码的写法:
image

如果不要length()函数,则需要添加第二个参数在first1()上,命名为n,用于指定x的长度。
注意在该例中,将循环写成以下形式则无法运行:

image

这一方法的问题在于,它不能让我们获得所需元素的索引。因此,需要一个显式循环,这就需要计算x的长度。
该循环另一个问题是:要仔细进行编码,因为length(x)可能为0。下面看看在这种情况下,循环中的语句1:length(x)会发生什么:

image
image

在循环过程中,变量i先取值为1,然后取值0,但当x为空时,这显然不是我们想要的。
另一种较为保险的方法是,使用R 的高级函数seq(),我们将在2.4.4节中进行讨论。
2.1.3 作为向量的矩阵和数组
你将看到,数组和矩阵(在某种意义上说,甚至包括列表)实际上都是向量。只不过它们还有额外的类属性。例如矩阵有行数和列数。我们将在下一章详细讨论,但在本章我们没必要作区分,因为它们属于向量,在本章中讲到的一切内容,同样适用于它们。
考虑下面的例子:
image

这里2×2的矩阵m按列存储为一个四元向量,即(1,3,2,4)。现在对它加上(10,11,12,13),得到向量(11,14,14,17),但最终如例子中的结果,R记得我们是对矩阵进行操作,因此返回2×2的矩阵。

相关文章
|
9天前
R语言向量误差修正模型 (VECMs)分析长期利率和通胀率影响关系
R语言向量误差修正模型 (VECMs)分析长期利率和通胀率影响关系
13 0
|
9天前
|
算法
R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
12 1
|
8月前
|
存储 算法 C++
2.1 C++ STL 数组向量容器
Vector容器是C++ STL中的一个动态数组容器,可以在运行时动态地增加或减少其大小,存储相同数据类型的元素,提供了快速的随机访问和在末尾插入或删除元素的功能。 该容器可以方便、灵活地代替数组,容器可以实现动态对数组扩容删除等各种复杂操作,其时间复杂度`O(l)常数阶`,其他元素的插入和删除为`O(n)线性阶`,其中n为容器的元素个数,vector具有自动的内存管理机制,对于元素的插入和删除可动态调整所占用的内存空间。
30 0
|
8月前
|
索引
R语言笔记丨矩阵、数组介绍
R语言笔记丨矩阵、数组介绍
|
10月前
|
数据处理
R语言-数据处理:dplyr包select 函数条件选择列向量用法
dplyr中的select函数是一种非常实用的数据框列选择函数,本文分享了这个函数的一些最常用用法以供参考
108 0
|
10月前
|
数据挖掘
R语言_一个矩阵除以向量会发生什么
R语言_一个矩阵除以向量会发生什么
|
11月前
|
数据可视化 数据挖掘 Python
R语言利用转录组基因表达矩阵做基因共表达分析的学习资料推荐
R语言利用转录组基因表达矩阵做基因共表达分析的学习资料推荐
|
机器学习/深度学习 编译器 C++
C++ primer 复习 第三章 字符串,向量和数组(2)
C++ primer 复习 第三章 字符串,向量和数组
C++ primer 复习 第三章 字符串,向量和数组(2)
|
C语言 C++ 容器
C++ primer 复习 第三章 字符串,向量和数组(1)
C++ primer 复习 第三章 字符串,向量和数组
C++ primer 复习 第三章 字符串,向量和数组(1)
|
存储 数据挖掘 vr&ar
R 数据集的概念、向量、矩阵和数组|学习笔记
快速学习 R 数据集的概念、向量、矩阵和数组。
177 0
R 数据集的概念、向量、矩阵和数组|学习笔记