R Cheat Sheet (6): Subsetting Vectors

本节的主要内容是所指定的条件,从一个矢量中取出想要的元素。

1. 使用正整数矢量索引

对于如下的一个矢量:

> x
 [1]  1.1734365 -0.6219365         NA         NA -0.0639205  0.6324963         NA         NA -0.3065296
[10] -0.5687445 -0.4932911         NA         NA         NA         NA  0.4575920         NA  1.5744094
[19]         NA  0.5844190         NA -0.3893740         NA         NA         NA  1.1760746  0.3255992
[28]         NA         NA  0.2284119         NA         NA -0.3921425  0.2165383         NA         NA
[37]  1.0734018  1.4599238 -1.0811899 -0.1421180

可以使用索引矢量(index vectors)来取出制定的一段元素,如取出前10个元素:

> x[1:10]
 [1]  1.1734365 -0.6219365         NA         NA -0.0639205  0.6324963         NA         NA -0.3065296
[10] -0.5687445

 其中,1:10 是一个正整数矢量,用于索引x 中的元素:

> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10

在R中,索引是从1开始的,但R不会阻止我们访问第0个元素:

> x[0]
numeric(0)

 越界访问会返回NA:

> x[3000]
[1] NA

2. 使用逻辑矢量索引

除了形如1:10 的正整数矢量,还可以使用逻辑矢量、负整数矢量和字符串矢量来索引矢量。如使用逻辑矢量索引来获取非NA元素:

> y <- x[!is.na(x)]
> y
 [1]  1.1734365 -0.6219365 -0.0639205  0.6324963 -0.3065296 -0.5687445 -0.4932911  0.4575920  1.5744094
[10]  0.5844190 -0.3893740  1.1760746  0.3255992  0.2284119 -0.3921425  0.2165383  1.0734018  1.4599238
[19] -1.0811899 -0.1421180

又如获取大于0的元素:

> y[y > 0]
 [1] 1.1734365 0.6324963 0.4575920 1.5744094 0.5844190 1.1760746 0.3255992 0.2284119 0.2165383 1.0734018
[11] 1.4599238

由于NA不是一个值,而是一个代表未知量的占位符,表达式NA > 0 的值为NA:

> x[x > 0]
 [1] 1.1734365        NA        NA 0.6324963        NA        NA        NA        NA        NA        NA
[11] 0.4575920        NA 1.5744094        NA 0.5844190        NA        NA        NA        NA 1.1760746
[21] 0.3255992        NA        NA 0.2284119        NA        NA 0.2165383        NA        NA 1.0734018
[31] 1.4599238

可以在索引中进行更复杂的逻辑运算:

> x[!is.na(x) & x > 0]
 [1] 1.1734365 0.6324963 0.4575920 1.5744094 0.5844190 1.1760746 0.3255992 0.2284119 0.2165383 1.0734018
[11] 1.4599238

除了像前面一样使用x[1:10] 获取连续的10个元素,还可以使用正整数索引获取任意元素:

> x[c(3, 5, 7)]
[1]         NA -0.0639205         NA

3. 使用负整数矢量索引

使用负整数索引,会在结果中排除所对应的元素,如下面的例子可以用来获取x 中除了第2和第10个元素以外的其他所有元素:

> x[c(-2, -10)]
 [1]  1.1734365         NA         NA -0.0639205  0.6324963         NA         NA -0.3065296 -0.4932911
[10]         NA         NA         NA         NA  0.4575920         NA  1.5744094         NA  0.5844190
[19]         NA -0.3893740         NA         NA         NA  1.1760746  0.3255992         NA         NA
[28]  0.2284119         NA         NA -0.3921425  0.2165383         NA         NA  1.0734018  1.4599238
[37] -1.0811899 -0.1421180

 也可以使用x[-c(2, 10)] 达到和上面例子同样的效果。

4. 使用字符串矢量索引

字符串矢量用来索引命名的元素,如下面的矢量包含三个元素,并进行了命名:

> vect <- c(foo = 11, bar = 2, norf = NA)
> vect
 foo  bar norf 
  11    2   NA

可以使用names() 函数查看各元素的名称:

> names(vect)
[1] "foo"  "bar"  "norf"

也可以通过对names() 赋值,来进行命名:

> vect2 <- c(11, 2, NA)
> names(vect2) <- c("foo", "bar", "norf")
> vect2
 foo  bar norf 
  11    2   NA

此时vect 和vect2 是相同的:

> identical(vect, vect2)
[1] TRUE

可以直接使用名称来索引元素:

> vect["bar"]
bar 
  2 
> vect[c("foo", "bar")]
foo bar 
 11   2