原子载体
原子向量(不包括列表和表达式,也是向量)是使用 [
运算符的子集:
# create an example vector
v1 <- c("a", "b", "c", "d")
# select the third element
v1[3]
## [1] "c"
[
运算符也可以将向量作为参数。例如,要选择第一个和第三个元素:
v1 <- c("a", "b", "c", "d")
v1[c(1, 3)]
## [1] "a" "c"
有时我们可能需要从向量中省略特定值。这可以使用该值的索引之前的负号(-
)来实现。例如,要省略从 v1 中省略第一个值,请使用 v1[-1]
。这可以直接扩展到多个值。例如,v1[-c(1,3)]
。
> v1[-1]
[1] "b" "c" "d"
> v1[-c(1,3)]
[1] "b" "d"
在某些情况下,我们想知道,特别是当向量的长度很大时,特定值的索引(如果存在):
> v1=="c"
[1] FALSE FALSE TRUE FALSE
> which(v1=="c")
[1] 3
如果原子向量具有名称(names
属性),则它可以是使用名称字符向量的子集:
v <- 1:3
names(v) <- c("one", "two", "three")
v
## one two three
## 1 2 3
v["two"]
## two
## 2
[[
运算符也可用于索引原子向量,区别在于它接受长度为 1 的索引向量并删除任何存在的名称:
v[[c(1, 2)]]
## Error in v[[c(1, 2)]] :
## attempt to select more than one element in vectorIndex
v[["two"]]
## [1] 2
矢量也可以是使用逻辑矢量的子集。与使用数字和字符向量的子集相比,用于子集的逻辑向量必须等于其元素被提取的向量的长度,因此如果逻辑向量 y
用于子集 x
,即 x[y]
,如果 length(y) < length(x)
则 y
将被回收以匹配 length(x)
:
v[c(TRUE, FALSE, TRUE)]
## one three
## 1 3
v[c(FALSE, TRUE)] # recycled to 'c(FALSE, TRUE, FALSE)'
## two
## 2
v[TRUE] # recycled to 'c(TRUE, TRUE, TRUE)'
## one two three
## 1 2 3
v[FALSE] # handy to discard elements but save the vector's type and basic structure
## named integer(0)