冯洋洋
2017年10月31日
1.reshape2包简介
reshap2包包含了一些对数据进行重构的函数,是reshape包的升级版本,作者Hadley Wickham h.wickham@gmail.com。 数据重构一般是指数据形态、格式以及数据类型的转换,将数据从一种数据形态转换到另一种数据形态,从一种数据格式转换到另一种格式……。通常,这意味着需要对数据进行维度转换,reshape2包就是为此而开发的。
2.reshape2包中的函数
2.1 acast
- 功能
功能在2.3节已经介绍的很详细了,现在主要介绍acast函数的使用方法以及返回的结果。 acast返回的是一个数组,其中~左侧的作为行名,~右侧的作为列名。假设有一个已经经过melt的数据集melt.v,其前几行如下所示
head(melt.v)
## m d pg finished
## 1 6 1 pg1 11.19101
## 2 6 2 pg1 14.41018
## 3 6 3 pg1 19.27001
## 4 6 4 pg1 15.16469
## 5 6 5 pg1 12.59584
## 6 6 1 pg2 15.23242
其中,pg表示项目组,finished表示完工百分比。
现在,假设我要求每个项目组的进度,即一共完成了百分之多少,则通过如下操作完成:
acast(melt.v,pg~m,fun.aggregate = sum)
## 6
## pg1 72.63173
## pg2 71.87603
## pg3 80.66047
可以看出,公式的两边要求最好是分类变量,然后才能进行聚合运算。如果把cast的返回结果理解为列联表,那么就比较容易理解了。列联表的两个变量肯定都是分类变量。 上面的数据量太小,下面我们用R中自带的数据集airquality来进行演示,展示更多的功能。 airquality是一个记录了空气质量的数据集,是一个154行6列的数据框,各列详情如下所示:
Ozone: Mean ozone in parts per billion from 1300 to 1500 hours at Roosevelt Island(臭氧浓度)
Solar.R: Solar radiation in Langleys in the frequency band 4000–7700 Angstroms from 0800 to 1200 hours at Central Park(阳光辐射)
Wind: Average wind speed in miles per hour at 0700 and 1000 hours at LaGuardia Airport(风速)
Temp: Maximum daily temperature in degrees Fahrenheit at La Guardia Airport.(最高温度)
month:(月份)
day:(日期)
那么,首先对此数据进行融合:
#由于具有缺失值,此时na.rm设置为TRUE
names(airquality) <-tolower(names(airquality))
melt.air <-melt(airquality,id.vars = c('month','day'),variable.name = 'index',na.rm = TRUE)
summary(melt.air)
## month day index value
## Min. :5.000 Min. : 1.00 ozone :116 Min. : 1.00
## 1st Qu.:6.000 1st Qu.: 8.00 solar.r:146 1st Qu.: 13.00
## Median :7.000 Median :16.00 wind :153 Median : 66.00
## Mean :7.044 Mean :15.83 temp :153 Mean : 80.06
## 3rd Qu.:8.000 3rd Qu.:23.00 3rd Qu.: 91.00
## Max. :9.000 Max. :31.00 Max. :334.00
融合以后的数据如上所示。根据上面的数据,我们可以进行许多分析。
- 计算每个月各个指标的平均值:
acast(data = melt.air,formula = month~index,fun.aggregate = 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.96774
## 9 31.44828 167.4333 10.180000 76.90000
- 使用dcast运行上述函数。
dcast(data = melt.air,formula = month~index,fun.aggregate = 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会为月份添加一个列名——因为要返回数据框的形式。
- 按照日期-月份-指标,生成一个三维数组。
acast(melt.air,day~month~index)
## , , ozone
##
## 5 6 7 8 9
## 1 41 NA 135 39 96
## 2 36 NA 49 9 78
## 3 12 NA 32 16 73
## 4 18 NA NA 78 91
## 5 NA NA 64 35 47
## 6 28 NA 40 66 32
## 7 23 29 77 122 20
## 8 19 NA 97 89 23
## 9 8 71 97 110 21
## 10 NA 39 85 NA 24
## 11 7 NA NA NA 44
## 12 16 NA 10 44 21
## 13 11 23 27 28 28
## 14 14 NA NA 65 9
## 15 18 NA 7 NA 13
## 16 14 21 48 22 46
## 17 34 37 35 59 18
## 18 6 20 61 23 13
## 19 30 12 79 31 24
## 20 11 13 63 44 16
## 21 1 NA 16 21 13
## 22 11 NA NA 9 23
## 23 4 NA NA NA 36
## 24 32 NA 80 45 7
## 25 NA NA 108 168 14
## 26 NA NA 20 73 30
## 27 NA NA 52 NA NA
## 28 23 NA 82 76 14
## 29 45 NA 50 118 18
## 30 115 NA 64 84 20
## 31 37 NA 59 85 NA
##
## , , solar.r
##
## 5 6 7 8 9
## 1 190 286 269 83 167
## 2 118 287 248 24 197
## 3 149 242 236 77 183
## 4 313 186 101 NA 189
## 5 NA 220 175 NA 95
## 6 NA 264 314 NA 92
## 7 299 127 276 255 252
## 8 99 273 267 229 220
## 9 19 291 272 207 230
## 10 194 323 175 222 259
## 11 NA 259 139 137 236
## 12 256 250 264 192 259
## 13 290 148 175 273 238
## 14 274 332 291 157 24
## 15 65 322 48 64 112
## 16 334 191 260 71 237
## 17 307 284 274 51 224
## 18 78 37 285 115 27
## 19 322 120 187 244 238
## 20 44 137 220 190 201
## 21 8 150 7 259 238
## 22 320 59 258 36 14
## 23 25 91 295 255 139
## 24 92 250 294 212 49
## 25 66 135 223 238 20
## 26 266 127 81 215 193