Loading

R学习-6.Subsetting Vectors

Subsetting Vectors

这一节,学习如何获取vector的子集。比如选取一个向量中的前20个元素、选取非NA的元素、或者大于某个数的元素等。

选取子集的方式类似X[index_vector],Xindex_vector都是向量,通过调用X[index_vector],R会根据index_vectorX里挑选出特定的元素。

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,这是一个向量,其包含的元素是TRUEorFALSE

> 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 

上一节:R学习-5.Missing Values

下一节:R学习-7.Matrices and Data Frames

posted @ 2020-06-19 11:25  何物昂  阅读(370)  评论(0编辑  收藏  举报