本文内容来自《R 语言编程艺术》(The Art of R Programming),有部分修改
R 语言最基本的数据类型是向量
本节会关注以下话题:
循环补齐
筛选
向量化
注:本文代码运行在 Jupyter Notebook 中,所以使用
标量、向量、数组与矩阵
R 语言中变量类型被称为模式 (mode)。同一向量中的所有元素必须是相同的模式。
添加或删除向量元素
R 语言中向量是连续存储的,不能插入或删除数据。
注:类似 C++ 中的
std::array
,在创建时就已经确定数组大小,后续无法修改大小
插入和删除数据实际上是对变量重新赋值
注:插入删除数据会生成新的向量
c(88, 5, 12, 13)
x c(x[1:3], 168, x[4])print(x)
[1] 88 5 12 168 13
注:可以将 x 看成类似 C 语言中的指针
获取向量长度
使用 length()
函数
c(1, 2, 4)print(length(x))
[1] 3
获取第一个 1 所在位置的索引(不一定有效率)
function(x) {
for (i in 1:length(x)) {
if (x[i] == 1) break
}return(i)
}print(first1(c(12, 13, 1, 3, 4)))
[1] 3
R 语言中,1:n
返回从 1 到 n 的向量,类似 Python 中的 range
函数。
但 first1
不能处理 x
为空的情况
代码
print(
会抛出下面的异常
Error in if (x[i] == 1) break: 参数长度为零
Traceback:
1. print(first1(c()))
2. first1(c())
c()print(x)
NULL
print(
[1] 0
print(
[1] 1 0
当 x
为空时,1:length(x)
返回值是 1 0
二元向量。
注:在 Python 中 list(range(1, 0))
返回的是空列表。
作为向量的矩阵和数组
数组和矩阵实际上都是向量,只不过有额外的类属性。
本节介绍的一切内容,同样适用于矩阵和数组。
rbind(c(1, 2, 3),c(4, 5, 6)
)print(m)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
print(m
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 6 9 12
上面的加法实际上就是两个向量相加
注:后续章节会介绍矩阵是按列存储的向量
声明
与 Python 一样,R 语言不需要声明变量。但引用向量中的特定元素前,必须事先创建该对象。
直接执行下面代码会出错
5
y[2] 6
我们需要首先创建长度为 2 的空向量,才能完成赋值。
使用 vector()
函数创建空向量
vector(length=2)print(y)
[1] FALSE FALSE
5print(y)
[1] 5 0
12print(y)
[1] 5 12
如果使用新类型的值赋值给某个元素,整个向量的类型也会自动改变(注:可能是生成了新的对象?)
"a"print(y)
[1] "a" "12"
类似 x
和 y
等变量只是对实际对象的绑定,本身没有类型限制,可以绑定任意类型
c(1, 5)print(mode(x))
[1] "numeric"
"abc"print(mode(x))
[1] "character"
循环补齐
两个向量使用运算符时,如果要求两个向量具有相同的长度,R 会自动循环补齐 (recycle),即重复较短的向量,直到它与另一个向量长度相匹配。
print(
Warning message in c(1, 2, 4) + c(6, 0, 9, 20, 22):
"长的对象长度不是短的对象长度的整倍数"
[1] 7 2 13 21 24
上面计算以如下方式执行
print(
[1] 7 2 13 21 24
注:numpy 中的广播机制好像只针对不同维度,无法实现上面运算。可以用 numpy.resize
模拟循环补齐效果。
下面是矩阵的例子
cbind(c(1, 2, 3),c(4, 5, 6)
)print(x)
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
print(x
[,1] [,2]
[1,] 2 6
[2,] 4 6
[3,] 4 8
矩阵是按列排序的向量,所以加号右边的向量被补齐到矩阵元素的个数
print(x
[,1] [,2]
[1,] 2 6
[2,] 4 6
[3,] 4 8
返回的结果同样被表示成矩阵的形式,实际上被补齐的向量在相加前也被转为矩阵形式,即
![cfd351af50389b4151835173efbfcd84.png](https://img-blog.csdnimg.cn/img_convert/cfd351af50389b4151835173efbfcd84.png)
print(x
[,1] [,2]
[1,] 2 6
[2,] 4 6
[3,] 4 8
常用的向量运算
向量运算和逻辑运算
R 是函数式语言,运算符也是一个函数
print(
[1] 5
print(
[1] 5
向量元素加法
c(1, 2, 4)print(x + c(5, 0, -1))
[1] 6 2 3
向量元素乘法
print(x
[1] 5 0 -4
其他元素运算
c(1, 2, 4)print(x / c(5, 4, -1))
[1] 0.2 0.5 -4.0
print(x
[1] 1 2 0
向量索引
向量1[向量2]
c(1.2, 3.9, 0.4, 0.12)print(y[c(1, 3)])