数据整理是统计分析的重要组成部分,想得到合意的分析结果,就必须把要处理的数据整理为适当的格式。在统计软件的使用中,很多模型函数并不是我们所关心的,因为它们像黑盒子,我们不知道内部的血腥情节。但若是想用好这些黑盒子,你必须懂得该给它填些什么东西,也就是它们需要啥样格式的数据。以此看来,软件的应用能力水平的高低就看数据整理质量的好坏(个人观点,欢迎拍砖)
在数据整理中,一个重要的内容是如何从数据集中取出自己需要的那一部分数据。也就是所谓的取子集。我们常常是按行来取,其实列的取法可以类推之。总结一下关于取子集的几种方法。
首先我们构建一个需要研究的数据集:
> library(bootstrap)
> data(hormone)
> #hormone #可以看下整个数据集的情况
> names(hormone)
[1] "Lot" "hrs" "amount"
> hormone$Lot
[1] "A" "A" "A" "A" "A" "A" "A" "A" "A" "B" "B" "B" "B" "B" "B" "B" "B" "B"
[19] "C" "C" "C" "C" "C" "C" "C" "C" "C"
> hormone$hrs
[1] 99 152 293 155 196 53 184 171 52 376 385 402 29 76 296 151 177 209
[19] 119 188 115 88 58 49 150 107 125
> hormone$amount
[1] 25.8 20.5 14.3 23.2 20.6 31.1 20.9 20.9 30.4 16.3 11.6 11.8 32.5 32.0
[15] 18.0 24.1 26.5 25.8 28.8 22.0 29.7 28.9 32.8 32.5 25.4 31.7 28.5
取子集方法之subset():
subset(x, subset, select),其中,x是我们要处理的数据集,subset是对行的约束条件,select是我们最终要显示的变量。当需同时满足多个条件时,用“&”连接条件,当只需满足众多条件之一时,用“|”连接条件。 我们取出Lot 为A的子集:
> subset(hormone, Lot == "A")
Lot hrs amount
1 A 99 25.8
2 A 152 20.5
3 A 293 14.3
4 A 155 23.2
5 A 196 20.6
6 A 53 31.1
7 A 184 20.9
8 A 171 20.9
9 A 52 30.4
我们取出Log为A或B的子集:
> subset(hormone, Lot == "A" | Lot == "B")
Lot hrs amount
1 A 99 25.8
2 A 152 20.5
3 A 293 14.3
4 A 155 23.2
5 A 196 20.6
6 A 53 31.1
7 A 184 20.9
8 A 171 20.9
9 A 52 30.4
10 B 376 16.3
11 B 385 11.6
12 B 402 11.8
13 B 29 32.5
14 B 76 32.0
15 B 296 18.0
16 B 151 24.1
17 B 177 26.5
18 B 209 25.8
我们选出Lot为A,hrs>80的子集,这个子集只包含hrs 和amount两个变量。
> subset(hormone, Lot == "A" & hrs > 80, select = c(Lot, hrs))
Lot hrs
1 A 99
2 A 152
3 A 293
4 A 155
5 A 196
7 A 184
8 A 171
去子集之下标法
Data[expression1, expression2],expression1用于取行,expression2用于取列。如果某条件缺失,意思就是要取出所有行(对应行条件缺失),或所有列(对应列条件缺失)。
我们用下标法依次完成上边的三个例子:
> hormone[hormone$Lot == "A", ]
Lot hrs amount
1 A 99 25.8
2 A 152 20.5
3 A 293 14.3
4 A 155 23.2
5 A 196 20.6
6 A 53 31.1
7 A 184 20.9
8 A 171 20.9
9 A 52 30.4
注意到这个例子是说变量Lot取特定的值A,有时我们要求的是只要Lot满足一个集合就行,比如Lot 取c(“A”, “B”)其中任何一个都行,这时候我们不用“==”,我们改用“%in%”符号,意为判断是否在这个集合中。 我们取出Log为A或B的子集:
> hormone[hormone$Lot %in% c("A", "B"), ]
Lot hrs amount
1 A 99 25.8
2 A 152 20.5
3 A 293 14.3
4 A 155 23.2
5 A 196 20.6
6 A 53 31.1
7 A 184 20.9
8 A 171 20.9
9 A 52 30.4
10 B 376 16.3
11 B 385 11.6
12 B 402 11.8
13 B 29 32.5
14 B 76 32.0
15 B 296 18.0
16 B 151 24.1
17 B 177 26.5
18 B 209 25.8
我们选出Lot为A,hrs>80的子集,这个子集只包含hrs 和amount两个变量。
> hormone[hormone$Lot == "A" & hormone$hrs > 80, 1:2]
Lot hrs
1 A 99
2 A 152
3 A 293
4 A 155
5 A 196
7 A 184
8 A 171
BTW:应用之rep()数据框版,rep()可以对向量重复,例如:
> rep(1:3, each = 2, times = 3)
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
那如果要把一个数据集重复怎么办呢,采用下标法就可以了:
例如,我们想把log 为B的子集重复为两遍:
> index <- which(hormone$Lot == "B")
> row.index <- which(hormone$Lot == "B")
> repeat.row.index <- rep(row.index, times = 2)
> hormone[repeat.row.index, ]
Lot hrs amount
10 B 376 16.3
11 B 385 11.6
12 B 402 11.8
13 B 29 32.5
14 B 76 32.0
15 B 296 18.0
16 B 151 24.1
17 B 177 26.5
18 B 209 25.8
10.1 B 376 16.3
11.1 B 385 11.6
12.1 B 402 11.8
13.1 B 29 32.5
14.1 B 76 32.0
15.1 B 296 18.0
16.1 B 151 24.1
17.1 B 177 26.5
18.1 B 209 25.8