R 中的向量是处理数据的原生方式。除了你在线性代数课本中看到的向量运算,R 还支持更多。在这篇博文中,你将学习到:
- 如何操作向量
- 如何将向量视为集合
让我们开始吧。

R语言中的向量操作
图片由 Pablo García Saldaña 拍摄。保留部分权利。
概述
这篇博文分为三部分;它们是:
- 读取和修改向量
- 向量作为集合
- R 中的数组
读取和修改向量
R 中最简单的向量是整数向量,创建方式如下:
1 |
x <- 2:100 |
这提供了连续整数序列的两个端点,并创建了一个向量。对于更复杂的向量,你可以使用 seq()
函数,它用于生成算术级数。
1 |
y <- seq(from=2, to=100, by=1) |
或者对于任意数字序列,使用 c()
函数:
1 |
y <- c(2, 3, 5, 8, 13, 21, 34) |
给定一个长向量,你可以通过提供索引来从中提取一个元素:
1 |
print(x[1]) |
以上代码打印了向量 x
的第一个元素。请注意,在 R 中,索引从 1 开始。
相同的语法也支持多个索引。例如,要获取向量 x
的前 5 个元素,你可以使用:
1 |
print(x[1:5]) |
这是因为 1:5 就是 1, 2, 3, 4, 5。这些将是访问向量 x
的索引。结果将是 x
中相应位置的五个元素,形成一个新的向量。因为 1:5 本身就是一个向量,你也可以这样做:
1 |
print(x[c(2,3,5,7)]) |
这可以类似地解释。
更新向量中的一个元素就像赋值一样简单:
1 2 |
x[4] <- 42 x[4:5] <- c(42, 43) |
但如果你想在向量中插入新元素而不是覆盖现有元素,你需要使用 append()
函数:
1 2 |
x <- append(x, 101) x <- append(x, c(102, 103)) |
实际上,append()
函数不仅可以在向量末尾工作,还可以在中间的任何位置工作:
1 |
x <- append(x, -1, after=0) |
请注意,R 的索引是从 1 开始的,所以上面的 “after=0
” 意味着在开头插入元素。事实上,在开头插入元素与将一个单元素向量连接到另一个向量是相同的。因此,你也可以使用以下语法:
1 |
x <- c(-1, x) |
顺便说一下,R 中的 c()
函数代表“combine”(合并)。这个函数可以帮助你将多个向量连接成一个。
另外请注意,R 中几乎所有东西都是不可变的。append 操作会创建一个新向量。因此,你需要重新赋值给向量来更新它。
要从向量中删除一个元素,你需要这样做:
1 |
x <- x[-3] |
这从 x
中删除了 x[3]
这个元素。但由于 R 中的向量是不可变的,这会创建一个新向量而不是更新它。因此,你需要将其存储在一个变量中来保留结果。
要从向量中删除多个元素,你可以使用索引向量的负值:
1 2 |
x <- x[-c(2,4,6,8)] x <- x[-(2:5)] |
总结一下,R 将负索引视为删除请求。
向量作为集合
向量是 R 中基本的数据对象。在数学上,向量是有序元组,其元素的顺序很重要。无序元组是集合。在 R 中,我们可以将向量用作集合。
让我们看一个例子:
1 2 3 4 |
w <- c("apple", "banana", "cantaloupe") x <- c("apple", "banana", "cantaloupe") y <- c("banana", "pear", "tangerine") z <- c("cantaloupe", "banana", "apple") |
这里定义了四个向量。你可以看出 w
和 x
是相同的向量:
1 |
identical(w, x) |
返回 TRUE
。但是 x
和 z
在向量意义上不是相同的。它们是同一个集合,因为你可以从以下看出:
1 |
setequal(x, z) |
事实上,只要唯一元素完全匹配,setequal()
就会对大小不同的向量报告 TRUE
,因为集合不考虑重复元素。
正如你所料,你可以生成一个新向量,在集合意义上表示并集和交集:
1 2 |
intersect(x,y) union(x,y) |
此外,你还可以找到集合差集:
1 2 |
setdiff(x, y) setdiff(y, x) |
这两个产生的结果不同,因为集合差集是指从第一个集合中移除所有出现在第二个集合中的元素。
将向量视为集合,你现在可以检查某个元素是否是成员:
1 |
“apple” %in% x # TRUE |
不幸的是,R 中没有 “not in” 运算符。你需要对布尔值取反来表示:
1 |
!(“apple” %in x) # FALSE |
R 中的数组
在上一篇博文中,你已经看到了如何将向量转换为矩阵。矩阵是数据的二维表示。如果你需要更高维度,就需要数组。
要将向量转换为数组,你可以使用与矩阵类似的语法,不同之处在于你需要明确指定维度(并确保向量中的元素数量匹配):
1 |
x <- array(2:25, dim=c(3,2,4)) |
在 R 中,数组是沿着第一个维度填充,然后是第二个维度,依此类推。因此,在上面的例子中,向量 2:25 以这种方式填充到数组 x
中,使得 x[,1,1]
是 c(2,3,4)
,而 x[,2,1]
是 c(5,6,7)
。
类似于向量索引,使用这样的三维数组,你可以使用以下语法从中提取一个二维数组:
1 |
x[c(1,2), c(1,2), 1] |
因为 x[c(1,2), 1, 1]
是 c(2,3)
,而 x[c(1,2), 2, 1]
是 c(5,6)
,上面的代码将给出:
$$
\begin{matrix}
2 & 5 \\
3 & 6 \\
\end{matrix}
$$
要从数组中取回一个向量,你可以简单地“转换”它的类型:
1 |
as.vector(x) |
进一步阅读
您可以从以下来源了解有关上述主题的更多信息:
网站
书籍
总结
在这篇博文中,你学习了 R 中一些有用的向量和数组操作。具体来说,你了解了:
- 如何对向量进行拼接
- 如何将向量用作集合
- 如何在 R 中使用多维数组
暂无评论。