第 3 章 子集选取

子集选取单独作一章,说明它确实很重要。

3.1 向量

对于原子型向量,我们有至少四种方法取子集

  • 正整数: 指定向量元素中的位置
## [1] 1.1
## [1] 3.3 1.1
  • 负整数:删除指定位置的元素
## [1] 1.1 3.3 4.4 5.5
  • 逻辑向量:将TRUE对应位置的元素提取出来
## [1] 1.1 3.3 5.5
  • 如果是命名向量
##  a  b  c  d 
## 11 12 13 14

我们可以用名字向量,返回对应位置的向量

##  d  c  a 
## 14 13 11

3.2 列表

对列表取子集,和向量的方法一样。使用[总是返回列表,[[$ 返回列表中的元素

## $one
## [1] "a" "b" "c"
## 
## $two
## [1] 1 2 3 4 5
## 
## $three
## [1]  TRUE FALSE
## $one
## [1] "a" "b" "c"
## [1] "a" "b" "c"

也可以

## [1] "a" "b" "c"

取出one位置上的元素,需要写[["one"]], 程序员觉得太麻烦了,所以用$来简写

## [1] "a" "b" "c"

所以请记住 - [[[的区别 -x$yx[["y"]]的简写

3.3 矩阵

##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

我们取第1到2行的2-3列,[1:2, 2:3],中间以逗号分隔,于是得到一个新的矩阵

##      [,1] [,2]
## [1,]    4    7
## [2,]    5    8

默认情况下, [ 会将获取的数据,以尽可能低的维度形式呈现。比如

## [1] 1 4

表示第1行的第1、2列,此时不是\(1 \times 2\)矩阵,而是包含了两个元素的向量。 以尽可能低的维度形式呈现,换句话说,这个1, 4长的像个矩阵,又有点像向量,向量的维度比矩阵低,那就是向量吧。

有些时候,我们想保留所有的行或者列,比如这里我们选取1到2行的所有列,可以这样简写

##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8

想想,会输出什么

##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

可以再简化点?

##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

是不是可以再简化点?

##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

3.4 数据框

数据框具有list和matrix的属性,因此

  • 当选取数据框的某几列的时候,可以和list一样,指定元素位置,比如df[1:2]选取前两列
  • 也可以像矩阵一样,使用行和列的标识选取,比如df[1:3, ]选取前三行的所有列
##   x y z
## 1 1 4 a
## 2 2 3 b
## 3 3 2 c
## 4 4 1 d
##   x z
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
##   x z
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d

也可以通过行和列的位置

##   x y
## 1 1 4
## 2 2 3
## 3 3 2
## 4 4 1
##   x y z
## 1 1 4 a
## 2 2 3 b
## 3 3 2 c

也和矩阵一样,遇到单行单列的时候,数据会降维

## [1] 1 2 3 4

如果不想避免降维,需要多写一句话

##   x
## 1 1
## 2 2
## 3 3
## 4 4

这样输出的还是矩阵形式, 但程序员总是偷懒的,有时候我们也容易忘记写drop = FALSE, 所以我比较喜欢下面的tibble.

3.5 tibble

tibble是增强型的data.frame,选取tibble的行或者列,即使遇到单行或者单列的时候,数据也不会降维,总是返回tibble,即仍然是数据框的形式。

## # A tibble: 4 x 3
##       x     y z    
##   <int> <int> <chr>
## 1     1     4 a    
## 2     2     3 b    
## 3     3     2 c    
## 4     4     1 d
## # A tibble: 4 x 1
##       x
##   <int>
## 1     1
## 2     2
## 3     3
## 4     4
## # A tibble: 4 x 1
##       x
##   <int>
## 1     1
## 2     2
## 3     3
## 4     4

除此以外,tibble还有很多优良的特性

3.6 本章代码

Download ch03_subsetting.R

3.7 延伸阅读

  • 如何获取matrix(1:9, nrow = 3)上对角元? 对角元?
  • 对数据框,思考df["x"]df[["x"]]df$x三者的区别?
  • 如果x是一个矩阵,请问 x[] <- 0x <- 0 有什么区别?