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
> 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
> 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
> x[1:10] [1] 1.1734365 -0.6219365 NA NA -0.0639205 0.6324963 NA NA -0.3065296 [10] -0.5687445
> 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
> 1:10 [1] 1 2 3 4 5 6 7 8 9 10
> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10

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

> x[0]
numeric(0)
> x[0] numeric(0)
> x[0]
numeric(0)

 越界访问会返回NA:

> x[3000]
[1] NA
> x[3000] [1] 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
> 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
> 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
> 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
> 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[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[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[!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[!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
> x[c(3, 5, 7)] [1] NA -0.0639205 NA
> 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)] [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)]
 [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
> vect <- c(foo = 11, bar = 2, norf = NA) > vect foo bar norf 11 2 NA
> vect <- c(foo = 11, bar = 2, norf = NA)
> vect
 foo  bar norf 
  11    2   NA

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

> names(vect)
[1] "foo" "bar" "norf"
> names(vect) [1] "foo" "bar" "norf"
> 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
> vect2 <- c(11, 2, NA) > names(vect2) <- c("foo", "bar", "norf") > vect2 foo bar norf 11 2 NA
> 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
> identical(vect, vect2) [1] TRUE
> identical(vect, vect2)
[1] TRUE

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

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