R 构建子集

小结

  • 构建子集 []/ [[]]/$/[[]][]/[[]][[]]
  • 处理缺失值: is.na()/complete.cases()
  • 向量化操作

构建子集(subsetting)

  • 原始数据(raw dataset) -> 预处理后的数据(clean dataset)
  • 基本方法
    • []: 提取一个或多个同类型相同的元素
    • [[]]: 从列表或数据框中提取元素
    • $:按名字从列表或数据框中提取元素

R数组下标从 1 开始

> x <- 1:10
> x[1]
[1] 1
> x[5]
[1] 5
> x[1:5]
[1] 1 2 3 4 5
> x[x>5]
[1]  6  7  8  9 10
> x>5
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
[10]  TRUE
> 
> x[x>5 & x<7]
[1] 6
> 
> x[x<3 | x>7]
[1]  1  2  8  9 10
> 
> y <- 1:4
> y
[1] 1 2 3 4
> 
> names(y) <- c('a', 'b', 'c', 'c')
> y
a b c c 
1 2 3 4 
> y[2]
b 
2 
> y['b']
b 
2 

矩阵的子集

> x <- matrix(1:6, nrow =2, ncol =3)
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> 
> x[1,2]
[1] 3
> x[2,3]
[1] 6
> 
> x[1,]
[1] 1 3 5
> x[,2]
[1] 3 4
> 
> x[2, c(1,3)]
[1] 2 6
> 
# 返回的是向量
> class(x[1,2])
[1] "integer"
> 
# 关闭返回向量,返回是矩阵
> x[1,2, drop = FALSE]
     [,1]
[1,]    3

dataframe

> x <- data.frame(v1=1:5, v2=6:10, v3=11:15)
> x
  v1 v2 v3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15
> 
> x$v3[c(2,4)] <- NA
> 
> x
  v1 v2 v3
1  1  6 11
2  2  7 NA
3  3  8 13
4  4  9 NA
5  5 10 15
> 
> x[,2]
[1]  6  7  8  9 10
> x[,'v2']
[1]  6  7  8  9 10
> 
> x[(x$v1<4 & x$v2>=8),]
  v1 v2 v3
3  3  8 13
> 
> x[(x$v1<4 | x$v2>=8),]
  v1 v2 v3
1  1  6 11
2  2  7 NA
3  3  8 13
4  4  9 NA
5  5 10 15
> x[x$v1 >2,]
  v1 v2 v3
3  3  8 13
4  4  9 NA
5  5 10 15
> 
> #得到具体行数
> x[which(x$v1>2),]
  v1 v2 v3
3  3  8 13
4  4  9 NA
5  5 10 15
> 
> which(x$v1>2)
[1] 3 4 5
> x$v1>2
[1] FALSE FALSE  TRUE  TRUE  TRUE
> 
> 
> subset(x,x$v1>2)
  v1 v2 v3
3  3  8 13
4  4  9 NA
5  5 10 15

列表的子集

  • [[]]/ $/ [[]][]/ [[]][[]]
  • 嵌套列表/不完全匹配(partial matching)
> x <- list(id=1:4, height = 170, gender='male')
> x
$id
[1] 1 2 3 4

$height
[1] 170

$gender
[1] "male"
  • 列表有单括号,只能拿到对应元素的名字和内容 单括号不能拿到纯内容
> x[1]
$id
[1] 1 2 3 4

> x['id']
$id
[1] 1 2 3 4
  • 拿到列表内容
    • 双括号, index/name
    • $
# 双括号
> x[[1]]
[1] 1 2 3 4
> x[['id']]
[1] 1 2 3 4
# $
> x$id
[1] 1 2 3 4
> 
# 多个元素
> x[c(1,3)]
$id
[1] 1 2 3 4

$gender
[1] "male"


> y <- 'id'
> x[['id']]
[1] 1 2 3 4
> x[[y]]
[1] 1 2 3 4
> x$id
[1] 1 2 3 4
> x$y
NULL
  • 嵌套元素
# 嵌套元素
> x <- list(a=list(1,2,3,4), b=c('Monday','Tuesday'))
> x
$a
$a[[1]]
[1] 1

$a[[2]]
[1] 2

$a[[3]]
[1] 3

$a[[4]]
[1] 4


$b
[1] "Monday"  "Tuesday"

> 
> x[[1]]
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

> 
> x[[1]][[2]]
[1] 2
> x[[1]][2]
[[1]]
[1] 2

> 
> x[[c(1,3)]]
[1] 3
> x[[c(2,2)]]
[1] "Tuesday"
  • 不完全匹配
# 不完全匹配
> 
> l <- list(asdfghj = 1:10)
> l$asdfghj
 [1]  1  2  3  4  5  6  7  8  9 10
> l$a
 [1]  1  2  3  4  5  6  7  8  9 10
> l[['a']]
NULL
> l[['a',exact=FALSE]]
 [1]  1  2  3  4  5  6  7  8  9 10
> 
> x <- list(asdfghj = 1:10, b=1:2, aaa=3:5)
> x
$asdfghj
 [1]  1  2  3  4  5  6  7  8  9 10

$b
[1] 1 2

$aaa
[1] 3 4 5

> x$a
NULL
> x[['a', exact=FALSE]]
NULL
> x$as
 [1]  1  2  3  4  5  6  7  8  9 10

处理缺失值

> x <- c(1,NA,2,NA,3)
> 
> is.na(x)
[1] FALSE  TRUE FALSE  TRUE FALSE
> 
> x[!is.na(x)]
[1] 1 2 3
> 
> y <- c('a', 'b', NA, 'c', 3)
> 
> z <- complete.cases(x,y)
> x[z]
[1] 1 3
> y[z]
[1] "a" "3"

complete

complete加载包中数据集

> library(datasets)
> 
> head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
> g <- complete.cases(airquality)
> g
  [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
 [10] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [19]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [28]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
 [37] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE
 [46] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [55] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
 [64]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
 [73]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [82]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [91]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE
[100]  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[109]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
[118]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[127]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[136]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[145]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
> 
> airquality[g, ][1:10,]
   Ozone Solar.R Wind Temp Month Day
1     41     190  7.4   67     5   1
2     36     118  8.0   72     5   2
3     12     149 12.6   74     5   3
4     18     313 11.5   62     5   4
7     23     299  8.6   65     5   7
8     19      99 13.8   59     5   8
9      8      19 20.1   61     5   9
12    16     256  9.7   69     5  12
13    11     290  9.2   66     5  13
14    14     274 10.9   68     5  14

向量化操作

  • 向量化操作(vectorized operation)
    • 可以作用于向量、矩阵等结构,使代码简洁、易于阅读
> x <- 1:5
> y <- 6:10
> 
> x+y
[1]  7  9 11 13 15
> x*y
[1]  6 14 24 36 50
> x/y
[1] 0.1666667 0.2857143 0.3750000 0.4444444 0.5000000
> 
> x <- matrix(1:4, nrow =2, ncol =2)
> y <- matrix(rep(2,4), nrow=2, ncol=2)
> x
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> y
     [,1] [,2]
[1,]    2    2
[2,]    2    2

矩阵乘

> x%*%y
     [,1] [,2]
[1,]    8    8
[2,]   12   12