在R中,想要给向量取子集,就是在向量的后面加上[]符号。通过在[]符号里填写数据来控制取向量的哪部分子集。
一般[]符号里可以有四种类型的内容:
第一种:整数型向量
这些向量要么全是正值,要么全是负值,要么是0。你不能有正有负。
这个整数就标记了需要取值的位置。
正值
比如:
r
x <- c("a","b","c","d")
x[c(3,2,1)]
[1] "c" "b" "a"
你瞧,通过c(3,2,1)这个向量,我就取出了x这个向量中的第3位,第2位,第1位。
不仅如此,这些位置还是可以重复的。
负值
当给了一个负数向量,这不代表是倒着取值,而是把这些值去掉。
比如:
r
x[c(-3,-2,-1)]
[1] "d"
第二种:字符型向量
如果你的向量的值都是有名字的,那可以把它们的名字组成一个向量进行取值。
r
x <- c("one"=1,"two"=2,"three"=3)
x[c("one","two")]
one two
1 2
第三种:空值
如果[]里面啥也没有,这代表取全部的向量值。从这个角度看,这个用法没啥用。
比如:
r
> x <- c("one"=1,"two"=2,"three"=3)
> x[]
one two three
1 2 3
> x
one two three
1 2 3
瞧,x和x[]没区别。
但是,在多维的向量中,这个功能就很常用,它能让我们取某n行所有列,或某n列所有行。
比如我们建立一个五行三列的数据框。
r
x <- data.frame(col1=c(1,2,3,4,5),col2=c("a","b","c","d","e"),col3=c("one","two","three","four","five"))
在构建过程中,我们知道,这个数据框是由三个等长的向量组成的。每个向量代表数据框的一个列。
那如果我们想取这个数据框的第一行所有列,你会怎么取呢?
r
> x[1,1:3]
col1 col2 col3
1 1 a one
在以上的方式中我们通过1:3来限定列的范围是第一列到第三列。但这样很麻烦,更简单的方法是:
r
> x[1,]
col1 col2 col3
1 1 a one
同理,如果你就不想要第三列。你想要所有行。那你可以这样写:
r
> x[,-3]
col1 col2
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
第四种:逻辑值
在取一个向量的子集时,我们会在[]中放上与向量等长的一个逻辑向量,结果会把对应为TRUE的子集取出来。
比如:
r
> x <- c("a","b","c","d","e")
> x[c(TRUE,FALSE,TRUE,FALSE,TRUE)]
[1] "a" "c" "e"
因为这个,我们常在[]放一些比较操作:
r
> x <- c(1,2,3,4,5)
> x[x>3]
[1] 4 5
大家要理解这个操作,一定要知道R语言是按照向量来操作的。当你说x>3时,是用x的每一个元素和3来比较,最后返回一个逻辑值向量。
r
> x>3
[1] FALSE FALSE FALSE TRUE TRUE