总结:
1)melt()函数将数据变成"长格式"-在绘图时很有用的一种格式。
2)melt()函数melt()默认id和measure两个参数互为补集,可只指定一个;两者的并集也可以不是colnames(dataframe),例如上图中measure可以只指定X1或者X2.
3)dcast()函数:当只重塑不整合时,可与pivot_*()系列函数类似;当即重塑又整合时,功能与summarise()函数类似。
除了tidyverse包中的pivot_longer()和pivot_wider()函数,还可以用reshape2包(作为reshape的重新设计版本,功能更强大)对Tidy Data进行操作。
reshape包并未包含在R的标准安装中,所以要先install.packages("reshape2")。
下面的示例数据是一个Tidy Data:
ID<-c(1,1,2,3)
Time<-c(1,2,1,2)
X1<-c(5,3,6,2)
X2<-c(6,5,1,4)
(data<-data.frame(ID,Time,X1,X2))
ID Time X1 X2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 3 2 2 4
在这个数据集(Tidy Data)中,measurement是指最后两列中的值,每个measurement都能被标识符变量唯一确定。这里的标识符指ID、Time和观测属于X1还是X2,也就是指定ID、Time再知道属于变量X1后就可以唯一确定一个值。
数据集的融合(melt)是要将数据变成这样一种格式:每个测量变量占一行,行中带有唯一确定这个measurement所需的标识符变量。(可以理解为melt之后的数据有两列是固定的:一列variable,一列value,其他列是标识符变量-也就是参数id指定的列列)。如下:
> library("reshape2")
> (mdate<-melt(data,id=c("ID","Time")))
ID Time variable value
1 1 1 X1 5
2 1 2 X1 3
3 2 1 X1 6
4 3 2 X1 2
5 1 1 X2 6
6 1 2 X2 5
7 2 1 X2 1
8 3 2 X2 4
融合后的数据可以用cast系列函数重铸为任何形状。cast系列函数包括dcast()和acast()两个函数,分别用于获得vector/matrix/array输出和dataframe输出。用dcast()函数入门。
dcast()函数的基本格式为:
newdata <- dcast(molten_data,formula,FUN)
其中,
- molten_data是融合后的数据;
- 对输出是dataframe,formula最多只能有两个维度,formula的格式是:
rowvar1+rowvar2+... ~ colvar1+colvar2+... ; - rowvar1、rowvar2、colvar1、colvar2等是molten data中除了value列之外的其他列。
- ~前的变量用来确定输出中的各行的内容,~后的变量用来确定输出中各列的内容。
- 有两个特殊变量 ... 和 .,前者代表没有在formula中使用的其他所有变量,后者代表没有变量,所以formula可以是formula=var1~. ;
- FUN是可选的数据整合函数。
-
重塑过程中,可以只重塑不整合,也可以整合。当formula中指定的变量不能唯一确定原始数据中的一行(个人理解为formula中指定的所有的变量集合小于molten data中列(除value)变量的集合),则需要提供一个FUN,这个FUN接受数字向量,返回一个summary统计信息【类似dplyr中summarise的功能】。
R语言实战书籍的Page104
-
melt()函数和cast序列函数都可以分为输出为dataframe和输出是array/list。以输出是dataframe为例,melt()函数的Usage:
melt(
data,
id.vars,
measure.vars,
variable.name = "variable",
...,
na.rm = FALSE,
value.name = "value",
factorsAsStrings = TRUE
)
- data:输入数据
- id.vars:ID变量,字符向量或者数字(变量位置)向量
- measure.vars:mearsure变量,字符向量或者数字(变量位置)向量
- variable.name:用于存储measure变量的变量名
-
value.name:用于存储measue值的变量名
id.vars和measue.vars是互补关系,如果只指定其中一个,则另一个为其补集;如果两个都没指定,则将因子和字符变量作为ID变量,其他的是measure变量。
输出dataframe中,variable列默认是因子。
学习dcast()函数的Usage:
dcast(
data,
formula,
fun.aggregate = NULL,
...,
margins = NULL,
subset = NULL,
fill = NULL,
drop = TRUE,
value.var = guess_value(data)
)
- data:molten data frame
- formula:对dataframe格式的输出,formula最多只有两个维度;其他格式的输出,可以有多个维度,格式为:x_variable + x_2 ~ y_variable + y_2 ~ z_variable ~ z_variable + z_2 ~ ...
- fun.aggragate:整合函数,若需要指定却未指定,则默认是长度统计
- margins:用来计算边距的向量
> names(airquality) <- tolower(names(airquality))
> aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
> head(aqm)
month day variable value
1 5 1 ozone 41
2 5 2 ozone 36
3 5 3 ozone 12
4 5 4 ozone 18
6 5 6 ozone 28
7 5 7 ozone 23
> dcast(aqm, month ~ variable, mean)
month ozone solar.r wind temp
1 5 23.61538 181.2963 11.622581 65.54839
2 6 29.44444 190.1667 10.266667 79.10000
3 7 59.11538 216.4839 8.941935 83.90323
4 8 59.96154 171.8571 8.793548 83.96774
5 9 31.44828 167.4333 10.180000 76.90000
# 加边距
> dcast(aqm, month ~ variable, mean, margins = c("month", "variable"))
month ozone solar.r wind temp (all)
1 5 23.61538 181.2963 11.622581 65.54839 68.70696
2 6 29.44444 190.1667 10.266667 79.10000 87.38384
3 7 59.11538 216.4839 8.941935 83.90323 93.49748
4 8 59.96154 171.8571 8.793548 83.96774 79.71207
5 9 31.44828 167.4333 10.180000 76.90000 71.82689
6 (all) 42.12931 185.9315 9.957516 77.88235 80.05722
- subset:在reshape之前取子集,格式是一个引用表达式(quoted expression):subset = .(取子集的表达式),例如subset= .(time < 10 & chick < 20)
# 因为要用到 . 函数,所以需要先加载plyr
> library(plyr)
# reshape前先取子集
> dcast(aqm, month ~ variable, mean, subset = .(variable=="ozone"))
month ozone
1 5 23.61538
2 6 29.44444
3 7 59.11538
4 8 59.96154
5 9 31.44828
- fill:用来填充结构缺失处的值
- drop:默认为TRUE,表示缺失的组合直接丢掉。也就是重塑后出现缺失值的行就直接丢掉了