R 是一种用于数据编程的语言。与其他许多语言不同,R 中的基本数据类型不是标量,而是向量。因此,理解如何处理向量对于编程或阅读 R 代码至关重要。在这篇文章中,您将了解 R 中的各种向量运算。具体来说,您将知道:
- R 中的基本数据对象是什么
- 如何在 R 中使用向量
让我们开始吧。

R 语言中的向量入门
照片作者:Frame Harirak。保留部分权利。
概述
这篇博文分为三部分;它们是:
- 基本数据对象
- 向量上的操作
- 从向量到矩阵
基本数据对象
在 Python 等其他编程语言中,您拥有整数、浮点数和字符串等基本数据元素。然而,在 R 中,基本元素是向量、列表、因子、数据框和环境。R 中有数据类型,例如字符、数值、整数、逻辑和复数。但 R 原生处理整数向量,而不是单个整数。
让我们从最简单的数据对象开始。要创建从 5 到 10 的整数向量,您可以键入 5:10
1 2 |
> 5:10 [1] 5 6 7 8 9 10 |
该语法使用冒号分隔两个端值,R 将其余值填充为连续的整数。您可以将此向量分配给一个变量并检索其值之一。
1 2 3 |
> x <- 5:10 > x[2] [1] 6 |
在 R 中,向量的索引从 1 开始,而不是 0。这遵循了数学文献中的约定。事实上,您可以使用向量中的多个索引来生成子向量,例如:
1 |
x[c(1,3,5)] |
将生成一个向量 (5,7,9)。
冒号语法适用于整数向量。但更复杂的模式需要使用 seq()
函数,例如:
1 2 |
> seq(from=-2, to=2, by=0.5) [1] -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 |
这将创建一个步长为偶数的数值向量。要检查向量的数据类型,我们可以运行以下命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
> x <- -5:5 > y <- seq(-2, 2, 0.5) > x [1] -5 -4 -3 -2 -1 0 1 2 3 4 5 > y [1] -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 > is.numeric(x) [1] TRUE > is.numeric(y) [1] TRUE > is.integer(x) [1] TRUE > is.integer(y) [1] FALSE |
事实上,由 seq()
函数构建的向量是数值型但不是整数型,因为步长可以是任意的。要检查向量是否为整数向量,我们使用 is.integer()
函数。“is.integer
”的名称中间有一个点。标识符中包含点作为合法字符是 R 语法的一个特性。
上面我们创建了两个向量。我们可以使用以下方法将它们连接起来:
1 2 3 |
> c(x,y) [1] -5.0 -4.0 -3.0 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 5.0 -2.0 -1.5 -1.0 -0.5 [16] 0.0 0.5 1.0 1.5 2.0 |
请注意,向量 x 中的整数已被转换为浮点值,以使向量类型保持一致。您可以显式转换数据,但这可能会产生副作用。例如,将上述内容转换为整数向量意味着四舍五入浮点数。
1 2 3 |
> z <- c(x,y) > as.integer(z) [1] -5 -4 -3 -2 -1 0 1 2 3 4 5 -2 -1 -1 0 0 0 1 1 2 |
向量上的操作
在 R 中,大多数向量操作都是逐元素应用的。例如:
1 2 3 4 |
> c(10, 9, 8, 7) %/% 3 [1] 3 3 2 2 > c(10, 9, 8, 7) %% 3 [1] 1 0 2 1 |
在上面,c(10, 9, 8, 7)
是连接四个单元素向量。运算符 “%/%
” 用于执行整数除法(丢弃余数),而运算符 “%%
” 用于返回余数。R 中的其他运算符与其他语言类似,例如 +
、-
、*
、/
、^
,分别表示加法、减法、乘法、除法和指数运算。
其他数学运算与您期望的一样。例如,这是指数函数和对数:
1 2 3 4 5 6 7 8 9 |
> exp(x) [1] 6.737947e-03 1.831564e-02 4.978707e-02 1.353353e-01 3.678794e-01 [6] 1.000000e+00 2.718282e+00 7.389056e+00 2.008554e+01 5.459815e+01 [11] 1.484132e+02 > log(x) [1] NaN NaN NaN NaN NaN -Inf 0.0000000 [8] 0.6931472 1.0986123 1.3862944 1.6094379 警告消息: 在 log(x) : NaNs 产生 |
您可以参考 R 文档了解内置函数的列表。或者,您可以使用 R 命令检查帮助:library(help = "base")
从向量到矩阵
R 中的矩阵是根据向量构建的。例如,矩阵:
$$
A = \begin{bmatrix}
9 & 2 & 1 \\
5 & -1 & 6 \\
4 & 0 & -2
\end{bmatrix}
$$
可以通过将向量填充到三列来构建:
1 2 3 4 5 6 |
> A <- matrix(c(9, 5, 4, 2, -1, 0, 1, 6, -2), ncol=3) > print(A) [,1] [,2] [,3] [1,] 9 2 1 [2,] 5 -1 6 [3,] 4 0 -2 |
请注意,向量是按列填充到矩阵中的,但您可以提供一个附加参数“byrow=TRUE
”来更改此行为。
您可以使用以下方法查看矩阵的维度:
1 2 |
> dim(A) [1] 3 3 |
此输出确实是一个向量。因此,您可以使用以下方法查找行数:
1 2 |
> dim(A)[1] [1] 3 |
在此示例中,您有一个方阵。因此,您可以使用以下方法找到其行列式和逆矩阵:
1 2 3 4 5 6 7 |
> det(A) [1] 90 > solve(A) [,1] [,2] [,3] [1,] 0.02222222 0.04444444 0.1444444 [2,] 0.37777778 -0.24444444 -0.5444444 [3,] 0.04444444 0.08888889 -0.2111111 |
正如您可能猜到的,R 中内置了许多其他矩阵运算,包括用于各种矩阵分解的 chol()
、qr()
和 svd()
。您可以通过将逆矩阵乘以原始矩阵来验证上述逆矩阵是否正确:
1 2 3 4 5 6 |
> A.inv <- solve(A) > A %*% A.inv [,1] [,2] [,3] [1,] 1.000000e+00 -6.938894e-17 -1.110223e-16 [2,] 6.938894e-17 1.000000e+00 0.000000e+00 [3,] 2.775558e-17 -8.326673e-17 1.000000e+00 |
矩阵乘法使用运算符 “%*%
”,因为 “*
” 用于逐元素乘法。除了浮点数的舍入误差外,乘积(如上所示)是单位矩阵。
使用矩阵,您可以使用以下方法提取行、列或特定元素:
1 2 3 4 5 6 7 8 9 10 11 |
> A [,1] [,2] [,3] [1,] 9 2 1 [2,] 5 -1 6 [3,] 4 0 -2 > A[,1] [1] 9 5 4 > A[2,] [1] 5 -1 6 > A[3,2] [1] 0 |
相反,您可以通过沿行或沿列“绑定”两个矩阵来构建更大的矩阵:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
> A [,1] [,2] [,3] [1,] 9 2 1 [2,] 5 -1 6 [3,] 4 0 -2 > A.inv [,1] [,2] [,3] [1,] 0.02222222 0.04444444 0.1444444 [2,] 0.37777778 -0.24444444 -0.5444444 [3,] 0.04444444 0.08888889 -0.2111111 > cbind(A, A.inv) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 9 2 1 0.02222222 0.04444444 0.1444444 [2,] 5 -1 6 0.37777778 -0.24444444 -0.5444444 [3,] 4 0 -2 0.04444444 0.08888889 -0.2111111 > rbind(A, A.inv) [,1] [,2] [,3] [1,] 9.00000000 2.00000000 1.0000000 [2,] 5.00000000 -1.00000000 6.0000000 [3,] 4.00000000 0.00000000 -2.0000000 [4,] 0.02222222 0.04444444 0.1444444 [5,] 0.37777778 -0.24444444 -0.5444444 [6,] 0.04444444 0.08888889 -0.2111111 |
进一步阅读
您可以从以下来源了解有关上述主题的更多信息:
网站
书籍
作为练习,您可以尝试:
- 创建一个包含“apple”、“banana”、“coconut”、“durian”的向量,然后从第一个向量创建另一个只包含前三个元素的向量。
- 找出 -2、2、5、8 的均方根值。
- 使用
solve()
函数来查找:
$$\begin{bmatrix}1 & 1 & 1\\ 0 & 2 & 5\\ 2 & 5 & -1\end{bmatrix}^{-1} \begin{bmatrix}6 \\ -4\\ 27\end{bmatrix}$$
总结
在这篇文章中,您学习了如何操作 R 的基本数据对象向量。具体来说,您学习了如何:
- 在 R 中创建向量
- 在 R 中执行向量运算
- 将向量转换为矩阵并执行一些矩阵运算
暂无评论。