打开png
png( "volcano.png", width = 7, height = 7, units = "in", res = 1200, pointsize = 4 )
数据分析时要长数据
长数据有一列数据是变量的类型,有一列是变量的值。长数据不一定只有两列。ggplot2需要长类型的数据,plyr也需要长类型的数据,大多数的模型(比如lm(), glm()以及gam())也需要长数据。
reshape2 包主要掌握melt和cast两个函数。
melt函数对宽数据进行处理,得到长数据;
cast函数对长数据进行处理,得到宽数据;
宽数据
# ozone wind temp
# 1 23.62 11.623 65.55
# 2 29.44 10.267 79.10
# 3 59.12 8.942 83.90
# 4 59.96 8.794 83.97
长数据
# variable value
# 1 ozone 23.615
# 2 ozone 29.444
# 3 ozone 59.115
# 4 ozone 59.962
# 5 wind 11.623
# 6 wind 10.267
# 7 wind 8.942
# 8 wind 8.794
# 9 temp 65.548
# 10 temp 79.100
# 11 temp 83.903
# 12 temp 83.968
melt函数:其中ID variables就是那些能够区分不同行数据的变量,类似于数据库中的主键。
此处用R内置的airquality数据集,首先将列名改成小写,然后查看相应的数据
names(airquality) <- tolower(names(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
默认情况下,melt认为所有数值列的变量均有值。很多情况下,这都是我们想要的情况。在这里,我们想知道每个月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我们需要告诉melt,month和day是"ID variables"。ID variables就是那些能够区分不同行数据的变量,类似于数据库中的主键。
aql <- melt(airquality, id.vars = c("month", "day"))
head(aql)
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
如果我们想修改长数据中的列名,该如何操作呢?
aql <- melt(airquality, id.vars = c("month", "day"),
variable.name = "climate_variable",
value.name = "climate_value")
head(aql)
month day climate_variable climate_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
cast函数
在reshape2中有好几个cast版本的函数。若你经常使用data.frame,就需要使用dcast函数。acast函数返回向量、矩阵或者数组。
dcast借助于公式来描述数据的形状,左边参数表示"ID variables",而右边的参数表示measured variables。可能需要几次尝试,才能找到合适的公式。
这里,我们需要告知dcast,month和day是ID variables,variable则表示measured variables。
aql <- melt(airquality, id.vars = c("month", "day"))
aqw <- dcast(aql, month + day ~ variable)
head(aqw)
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
head(airquality) # original data
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
除了需要调整下列变量的顺序,我们已经恢复出原始数据。下图将有助解释所发生的情况。
蓝色阴影块是能够表示每一行数据的ID variables;红色阴影块包含了将待生成数据的列名;而灰色的数据表示用于填充相关区域的数据。