语法结构:melt(data,id.vars,measure.vars,varnames,value.name…)
其中data可以是数据框,数组或列表;
1.数据类型为data.frame
length(airquality day)[1]153length(aqm day)[1] 568
aqm <- melt(airquality, id=c(“month”, “day”), na.rm=TRUE)
以month,day为id.vars,其他变量(measure.vars)均在variable列,value对应variable的取值
融合之前数据集(5列):
ozone solar.rwind 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
融合之后的结果(4列):
Head(aqm,4)
month day variable value
1 5 1 ozone 41
2 5 2 ozone 36
3 5 3 ozone 12
4 5 4 ozone 18
对比发现:
把airquality中的三个变量ozone,solar.rwind,temp合成一个变量variables,结果数据框会变长
2.data为列表,扔进去的是list,出来的是data.frame
l<-list(a=c(“John”,”Lucy”,”Peter”,”Shane”),b=c(80,76,90,88),c=c(“M”,”F”,”M”,”M”))
melt(l,id.vars = “a”)
value L1
1 John a
2 Lucy a
3 Peter a
4 Shane a
5 80 b
6 76 b
7 90 b
8 88 b
9 M c
10 F c
11 M c
12 M c
出来的data.frame包含两列,列表的成分名为一列,列名为L1;各成分值为一列,列名为value;
List中有list类型的成分,则melt转化为三列,L1为list成分名,L2为list下的成分名,L3类推,value为各成分值
3.data为array类型
datax <- array(1:8, dim=c(2,2,2))
melt(datax)
X1 X2 X3 value
1 1 1 1 1
2 2 1 1 2
3 1 2 1 3
4 2 2 1 4
5 1 1 2 5
6 2 1 2 6
7 1 2 2 7
8 2 2 2 8
一次对各维度的名称进行组合,将数据向量化。
如果数组有n维,那么得到的结果共有n+1列,前n列记录数组的位置信息,后一列是观测值
控制列名称
melt(datax,varnames=c(“A”,”B”,”C”),value.names = “VAL”)
A B C value
1 1 1 1 1
2 2 1 1 2
3 1 2 1 3
4 2 2 1 4
5 1 1 2 5
6 2 1 2 6
7 1 2 2 7
8 2 2 2 8
Long-format用处比较广,比如ggplot2,plyr,模型函数等。Wide-format更符合认知存储习惯。
——把长格式数据变成宽格式数据,并提供了一个数据整合函数
语法格式:
dcast(data, formula, fun.aggregate = NULL, …, margins = NULL)
acast(data, formula, fun.aggregate = NULL, …, margins = NULL,subset)
其中formula接受的公式形式:rowvar1 + rowvar2 +… ~ colvar1 + colvar2 + …
在这一公式中,rowvar1 + rowvar2 + …定义了要划掉的变量集合,以确定各行的内容,
而colvar1 + colvar2 + …则定义了要划掉的、确定各列内容的变量集合.
Subset是一个用来选择数据的引用表达式
acast(aqm, month ~ variable, mean, margins = TRUE)
ozone solar.r wind temp (all)
5 23.61538 181.2963 11.622581 65.54839 68.70696
6 29.44444 190.1667 10.266667 79.10000 87.38384
7 59.11538 216.4839 8.941935 83.90323 93.49748
8 59.96154 171.8571 8.793548 83.96774 79.71207
9 31.44828 167.4333 10.180000 76.90000 71.82689
(all) 42.12931 185.9315 9.957516 77.88235 80.05722
Margins表示对边缘(每行,每列)进行计算,若margins=FALSE则结果中不出现(all)这一列。
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.05722acast(aqm, variable ~ month, mean, subset = .(variable == “ozone”))
5 6 7 8 9
ozone 23.61538 29.44444 59.11538 59.96154 31.44828acast(aqm, month ~ variable, mean)
ozone solar.r wind temp
5 23.61538 181.2963 11.622581 65.54839
6 29.44444 190.1667 10.266667 79.10000
7 59.11538 216.4839 8.941935 83.90323
8 59.96154 171.8571 8.793548 83.96774acast(chick_m, diet ~ time, mean) # average effect of diet & time
0 2 4 6 8 10 12 14 16 18 20 21
1 41.4 47.25 56.47368 66.78947 79.68421 93.05263 108.5263 123.3889 144.6471 158.9412 170.4118 177.7500
2 40.7 49.40 59.80000 75.40000 91.70000 108.50000 131.3000 141.9000 164.7000 187.7000 205.6000 214.7000
3 40.8 50.40 62.20000 77.90000 98.40000 117.10000 144.4000 164.5000 197.4000 233.1000 258.9000 270.3000
4 41.0 51.80 64.50000 83.90000 105.60000 126.00000 151.4000 161.8000 182.0000 202.9000 233.8889 238.5556