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