数据重构简单实践
reshape2包
reshape2 包是一套重构和整合数据集的绝妙的万能工具,这里只按照本书做简单用法学习。它的深入功能要使用一个包,先要安装:
if(!require(reshape2)) install.packages("reshape2")
数据融合
数据融合(melt)使每一行都是唯一的标识符-变量组合。
使用书中的例子进行说明吧:
rm(list = ls())
ID <- c(1,1,2,2)
Time <- c(1,2,1,2)
X1 <- c(5,3,6,2)
X2 <- c(6,5,1,4)
mydt <- data.frame(ID, Time,X1,X2 )
> print(mydt)
ID Time X1 X2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
这个数据框中,标识变量为ID和Time,观测值数据变量为X1和X2,现在要做的是,使标识变量为ID和Time能够唯一地确定一个观测值,X1和X2则作为一个新衍生的变量的观测值成为一列,它们的观测值为值变量作为一列。
> if(!require(reshape2)) install.packages("reshape2")
载入需要的程辑包:reshape2
载入程辑包:‘reshape2’
The following object is masked from ‘package:tidyr’:
smiths
> melt(mydt, id.vars = c("ID" , "Time"))
ID Time variable value
1 1 1 X1 5
2 1 2 X1 3
3 2 1 X1 6
4 2 2 X1 2
5 1 1 X2 6
6 1 2 X2 5
7 2 1 X2 1
8 2 2 X2 4
注意, 必须指定要唯一确定每个测量所需的变量(ID和Time),而表示测量变量名的变量(X1或X2) 将由程序为你自动创建。
数据重铸
融合后的数据, 现在就可以使用dcast() 函数将它重铸为任意形状了。数据重铸 (cast) 为你想要的任何形状。 在重铸过程中, 你可以使用任何函数对数据进行整合。
dcast() 函数读取已融合的数据, 并使用你提供的公式和一个(可选的) 用于整合数据的函数将其重塑。
调用格式为:
newdata <- dcast(md, formula, fun.aggregate)
其中的 md 为已融合的数据, formula 描述了想要的最后结果, 而
fun.aggregate 是(可选的) 数据整合函数。其接受的公式形如:
rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...
[图片上传失败...(image-91e2e-1691908043678)]书中有一个图片总结的很好,可是不知道为何最近简书无法上传图片。
那我只能把图片列举的每种结果都运行一次了,我们一一来试过:
mt <- melt(mydt, id.vars = c("ID" , "Time"))
mt # 运行melt函数后融合数据集
ID Time variable value
1 1 1 X1 5
2 1 2 X1 3
3 2 1 X1 6
4 2 2 X1 2
5 1 1 X2 6
6 1 2 X2 5
7 2 1 X2 1
8 2 2 X2 4
不执行整合
- dcast(mt, ID + Time~variable)
ID Time X1 X2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
- dcast(mt, ID + variable~Time)
ID variable 1 2
1 1 X1 5 3
2 1 X2 6 5
3 2 X1 6 2
4 2 X2 1 4
执行整合
- dcast(mt, ID~variable, mean)
ID X1 X2
1 1 4 5.5
2 2 4 2.5
- dcast(mt, Time~variable, mean)
Time X1 X2
1 1 5.5 3.5
2 2 2.5 4.5
- dcast(mt, ID~Time, mean)
ID 1 2
1 1 5.5 4
2 2 3.5 3
如你所见, 函数melt() 和dcast() 提供了令人惊叹的灵活性。