reshape2

1. 安装导入reshape2

install.packages("reshape2")
library(reshape2)

2. 认识长数据与宽数据

宽数据是我们常见的数据集格式,因为这种格式符合数据收集的习惯和标准,数据集的每一列为一个观测变量,每一行为一组所有观测变量的观测值。宽数据格式看重的是一次观测的各个变量相对应的观测值,所以各个变量是重点,而变量数目一般会比观测数多,这样就显得数据集较宽,故称为宽数据。

> 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

长数据长数据有两个特殊的列:variable和value,variable列用于存放观测变量,value列用于存放观测变量对应的观测值。长数据格式用其特有的variable列和value列将观测结果细分,这在我们对单个变量进行分析而不是对所有变量进行分析时会简便得多,因其将每一个观测变量的观测值分开存储,造成variable列和value列较长,以致整个数据集显得较长,故称为长数据。

> data1 <- melt(airquality)
> head(data1)
  variable value
1    Ozone    41
2    Ozone    36
3    Ozone    12
4    Ozone    18
5    Ozone    NA
6    Ozone    28

3. 核心函数

3.1 melt()函数

melt()函数主要与数据的融合有关。数据的融合是指把数据集重塑为特定的格式,使得每个观测变量独占一行,每行都有唯一确定每个观测变量所需要的标识变量,简单一句就是将宽数据变为长数据。

melt(data, id.vars, measure.vars, variable.name = “variable”, …, na.rm = FALSE, value.name = “value”, factorsAsStrings = TRUE)

data:融合的数据框
id.vars:由标识变量构成的向量,用于标识观测的变量,根据标识标量对其它变量进行“融化”,标识变量本身不进行“融化”。
measure.vars :由观测变量构成的向量,对测量变量进行“融化”,其它变量不进行“融化”。
variable.name:用于保存原始变量名的变量的名称
value.name:用于保存原始值的名称

> data2 <- melt(airquality, id.vars = c('Month', 'Day'))
> print(data2)
    Month Day variable value
1       5   1    Ozone    41
2       5   2    Ozone    36
3       5   3    Ozone    12
4       5   4    Ozone    18
5       5   5    Ozone    NA
6       5   6    Ozone    28
7       5   7    Ozone    23
8       5   8    Ozone    19
···
242     7  28  Solar.R   213
243     7  29  Solar.R   275
244     7  30  Solar.R   253
245     7  31  Solar.R   254
246     8   1  Solar.R    83
247     8   2  Solar.R    24
248     8   3  Solar.R    77
249     8   4  Solar.R    NA
250     8   5  Solar.R    NA

在上面的例子中,函数中指定id.vars为Month和Day,因此MonthDay用于观测,并不进行融化,其他变量进行融化。

 data3 <- melt(iris, measure.vars = 'Species')
> data3
    Sepal.Length Sepal.Width Petal.Length Petal.Width variable      value
1            5.1         3.5          1.4         0.2  Species     setosa
2            4.9         3.0          1.4         0.2  Species     setosa
3            4.7         3.2          1.3         0.2  Species     setosa
4            4.6         3.1          1.5         0.2  Species     setosa
5            5.0         3.6          1.4         0.2  Species     setosa
6            5.4         3.9          1.7         0.4  Species     setosa
7            4.6         3.4          1.4         0.3  Species     setosa
8            5.0         3.4          1.5         0.2  Species     setosa
9            4.4         2.9          1.4         0.2  Species     setosa
10           4.9         3.1          1.5         0.1  Species     setosa
11           5.4         3.7          1.5         0.2  Species     setosa
12           4.8         3.4          1.6         0.2  Species     setosa
13           4.8         3.0          1.4         0.1  Species     setosa
14           4.3         3.0          1.1         0.1  Species     setosa

在上面的例子中,measure.vars指定为“Species”,而其他的变量就变成了id.vars,因此其他变量不变,只有“Species”被融化。

3.2 dcast()函数

dcast()函数用于读取已融合的数据框(d是指data frame),并使用formula和用于整合数据的函数把数据集重塑成任意形状:

dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,
  subset = NULL, fill = NULL, drop = TRUE, value.var = guess_value(data))

data:已融合的数据框
formula:用于指定输出的结果集格式
fun.aggregate:用于指定聚合函数,对已聚合的数据执行聚合运算
margins:相当于透视表中的行总计和列总计
subset:选取满足一些特定值的数据,相当于Excel透视表的筛选。例如, subset =.(variable ==“length”)
fill:用于填充结构缺失的值,默认为将fun.aggregate应用于0长度向量的值
value:value列的名称

formula的格式:

rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...

rowvar1 + rowvar2 + ...定义了要划掉的变量集合,以确定各行的内容,而colvar1 + colvar2 + ...则定义了要划掉的、确定各列内容的变量集合。

cast意为“铸造”,将长数据转化为宽数据,作者起的函数名很形象,melt就好像把金属融化,cast则是把融化的金属铸造,两者是相对的。如果你已经理解melt函数,那么cast与之相对就可以理解,那么我们就将之前融化后的data2进行重铸。

> data2 <- melt(airquality, id.vars = c('Month', 'Day'))
> data4 <- dcast(data2, Month + Day ~ variable)
> head(data4)
  Month Day Ozone Solar.R Wind Temp
1     5   1    41     190  7.4   67
2     5   2    36     118  8.0   72
3     5   3    12     149 12.6   74
4     5   4    18     313 11.5   62
5     5   5    NA      NA 14.3   56
6     5   6    28      NA 14.9   66

可以看出重铸后的data4与原来融化之前的data完全一样。
请横屏观看!

image

由于右侧(d、e和f)的公式中并未包括某个函数,所以数据仅被重塑了。反之,左侧的示 例(a、b和c)中指定了mean作为整合函数,从而就对数据同时进行了重塑与整合。例如,(a)中 给出了每个观测所有时刻中在X1和X2上的均值;示例(b)则给出了X1和X2在时刻1和时刻2的均 值,对不同的观测进行了平均;在(c)中则是每个观测在时刻1和时刻2的均值,对不同的X1和X2 进行了平均。

你可能感兴趣的:(reshape2)