数据整理之取子集


数据整理是统计分析的重要组成部分,想得到合意的分析结果,就必须把要处理的数据整理为适当的格式。在统计软件的使用中,很多模型函数并不是我们所关心的,因为它们像黑盒子,我们不知道内部的血腥情节。但若是想用好这些黑盒子,你必须懂得该给它填些什么东西,也就是它们需要啥样格式的数据。以此看来,软件的应用能力水平的高低就看数据整理质量的好坏(个人观点,欢迎拍砖)

在数据整理中,一个重要的内容是如何从数据集中取出自己需要的那一部分数据。也就是所谓的取子集。我们常常是按行来取,其实列的取法可以类推之。总结一下关于取子集的几种方法。

首先我们构建一个需要研究的数据集:


> 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


下篇: R笔记