统计中待分析的数据框通常有两种形式:
(1)长型数据(堆叠数据),长型数据是各变量取值在一列中,而对应的变量名在另一列。
(2)宽型数据(非堆叠数据),宽型数据一般是各变量取值类型一致,而变量以不同列的形式构成。(常用)

1. 例如iris的前四列子集即是一个典型的宽型数据。例如下面将宽型数据转为长型数据:

data_w <- iris[,1:4]
data_l <- stack(data_w)
head(data_l)
  values          ind
1    5.1 Sepal.Length
2    4.9 Sepal.Length
3    4.7 Sepal.Length
4    4.6 Sepal.Length
5    5.0 Sepal.Length
6    5.4 Sepal.Length
data_w <- unstack(data_l)

只要在一列中存在分类变量,都可以将其看作是长型数据。
在上例中iris的前四列可以看作是宽型数据,但最后两列可以看作是一个长型数据。

2. 可以根据Species变量将数据转为宽型。并得到各花种类的平均值。

> subdata<-iris[,4:5]
> head(subdata)                        #长型数据
  Petal.Width Species
1         0.2  setosa
2         0.2  setosa
3         0.2  setosa
4         0.2  setosa
5         0.2  setosa
6         0.4  setosa
> data_w<-unstack(subdata)
> head(data_w)
  setosa versicolor virginica      #宽型数据
1    0.2        1.4       2.5
2    0.2        1.5       1.9
3    0.2        1.5       2.1
4    0.2        1.3       1.8
5    0.2        1.5       2.2
6    0.4        1.3       2.1

> colMeans(data_w)         #列平均值
    setosa versicolor  virginica 
     0.246      1.326      2.026

数据重塑计算

3. 在上例中我们先转换数据格式再计算分析结果,而更常见的是一步直接得到分析结果。

library(reshape2)
dcast(data=subdata, # 分析对象
formula=Species~., # 数据分组的方式
value.var='Petal.Width', # 要计算的数值对象
fun=mean) # 计算用函数名

    Species     .
1     setosa 0.246
2 versicolor 1.326
3  virginica 2.026

dcast的思路和aggregate很相似,都是根据变量切分数据,再对分组后的数据进行计算,
但dcast的输出格式和功能在多维情况下要方便很多。

4. 将一个宽型数据融合成一个长型数据,即melt函数。例如我们将iris数据集进行融合。

iris_long <- melt(data=iris, # 要融合的对象
id='Species') # 哪些变量不参与到融合中

> head(iris_long)
  Species     variable value
1  setosa Sepal.Length   5.1
2  setosa Sepal.Length   4.9
3  setosa Sepal.Length   4.7
4  setosa Sepal.Length   4.6
5  setosa Sepal.Length   5.0
6  setosa Sepal.Length   5.4

一个纯粹的长型数据,只包含一个数值变量,其它均为分类变量。
而一个纯粹的宽型数据,则不包含分类变量,均为数值变量。
而现实中的数据多半是二者的混杂,正如iris数据集那样。

5. 下面的例子就是将之前生成的数据进行汇总计算

dcast(data=iris_long,
formula=Species~variable,
value.var='value',fun=mean)

     Species Sepal.Length Sepal.Width
1     setosa        5.006       3.428
2 versicolor        5.936       2.770
3  virginica        6.588       2.974
  Petal.Length Petal.Width
1        1.462       0.246
2        4.260       1.326
3        5.552       2.026

dcast函数的使用前提
数据中已经存在分类变量,例如sex或者smoke
根据分类变量划分数据
再计算某个数值变量的指标

6. 小练习

tips数据集练习,它是一个餐厅侍者收集的关于小费的数据,其中包含了七个变量,
包括总费用、付小费的金额、付款者性别、是否吸烟、日期、日间、顾客人数。
计算不同性别顾客是否会支付不同的小费比例。则可以按sex变量汇集数据。
或者,按sex和size变量划分数据,分别计算小费金额。

dcast(tips,sex~.,value.var='tip',fun=mean)
dcast(tips,sex~size,value.var='tip',fun=mean)

7. 合并两个数据框

按id号将它们合为一个数据框。不能使用cbind来合并,因为id的顺序不一样。
使用merge函数,按照id来合并两组数据,这种操作思路和数据库操作中的join是类似的。

datax <- data.frame(id=c(1,2,3),gender=c(23,34,41))
datay <- data.frame(id=c(3,1,2),name=c('tom','john','ken'))
merge(datax,datay,by='id')

8. 数据按变量拆分

常规的数据分拆其实就是取子集,使用subset函数即可完成。
非常规一点的数据拆分是按照某个分类变量进行的。
例如需要对iris数据中按不同的花的属性来分拆数据,使用split函数。

iris_splited <- split(iris,f=iris$Species)
class(iris_splited)   #拆分后数据类型为列表list
[1] "list"
> head(iris_splited[[1]])

9. 数据按变量合并

split函数可以将一个数据框拆分成多个数据框,存在一个列表对象中。
合并这个列表,只需要使用unsplit函数即可。

unsplit(iris_splited,f=iris$Species)