R学习-6.Subsetting Vectors
Subsetting Vectors
这一节,学习如何获取vector的子集。比如选取一个向量中的前20个元素、选取非NA
的元素、或者大于某个数的元素等。
选取子集的方式类似X[index_vector]
,X
和index_vector
都是向量,通过调用X[index_vector]
,R会根据index_vector
从X
里挑选出特定的元素。
index vector有四种类型:逻辑向量(logical vectors)、正整数向量( vectors of positive integers)、负整数向量( vectors of negative integers)和字符串向量( vectors of character strings)
先来看看正整数的index vector。注意R里的索引是从1开始的。而大多编程语言中是从0开始。编写程序时,注意索引不要是0和超过向量的长度值,当你这样做时,R不会报错,但会返回无意义的结果。
> x <- c(seq(10,1), rep(NA,10))
> x
[1] 10 9 8 7 6 5 4 3 2 1 NA NA NA NA NA NA NA NA NA NA
> x[1:5] # 选取前5个元素
[1] 10 9 8 7 6
> x[5:10] # 选取第5到第10个的元素
[1] 6 5 4 3 2 1
> x[c(1, 3, 5, 8)] # 也可以选取特定位置的元素
[1] 10 8 6 3
> x[6] # 选第6个
[1] 5
> x[0]
integer(0)
> x[100]
[1] NA
接下来看看负整数的index vector,负索引值,会排除负索引值的绝对值的相应位置的元素。比如:
> x <- c(seq(10,1), rep(NA,10))
> x[-1] # 第一个元素被排除了
[1] 9 8 7 6 5 4 3 2 1 NA NA NA NA NA NA NA NA NA NA
> x[c(-1, -2 , -10)]
[1] 8 7 6 5 4 3 2 NA NA NA NA NA NA NA NA NA NA
然后是logical vectors,这是一个向量,其包含的元素是TRUE
orFALSE
> x <- c(seq(10,1), rep(NA,10))
> is.na(x)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
[13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> x[is.na(x)] # 获取是NA的元素
[1] NA NA NA NA NA NA NA NA NA NA
> y <- x[!is.na(x)] 获取是非NA的元素
> y
[1] 10 9 8 7 6 5 4 3 2 1
使用logical vectors,操作性更强,更灵活。可以组合比较运算逻辑表达式等获得子集。
> y[y > 7] # 选取y中大于7的元素
[1] 10 9 8
> y[y < 5] # 选取y中小于5的元素
[1] 4 3 2 1
> y[(y > 7) | (y < 5)] # 选取中大于7或小于5的元素
[1] 10 9 8 4 3 2 1
最后是字符索引。我们需要创造一个向量元素有名字的向量。通过函数names()
可以获取vector names 也可以赋予一个向量names。
> vect <- c(foo = 11, bar =2, norf = NA)
> vect
foo bar norf
11 2 NA
> names(vect) # 通过函数names()获取向量元素名字
[1] "foo" "bar" "norf"
> vect2 <- c(11, 2, NA)
> names(vect2) <- c("foo", "bar", "norf") # names赋值
> names(vect2) #
[1] "foo" "bar" "norf"
向量元素有了名字,我们就可以通过名字来取得相应的元素了。
> vect["bar"]
bar
2
> vect[c("foo", "bar")]
foo bar
11 2