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