reshape 패키지는 자료가 정재되지 않은 상태일 때, plot 이나 table 만들기 불편함에 따라 재구조화 하기 위해 만든 패키지.

melt(data,id=기준변수,na.rm=T) (기준변수, 나머지변수명, 값)을 rbind해놓은 형태로 자료변환

library(reshape)

data("airquality")
head(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
names(airquality)
## [1] "Ozone"   "Solar.R" "Wind"    "Temp"    "Month"   "Day"
#Ozone, Solar.R, Wind, Temp, Month, Day
aqm=melt(airquality,id=names(airquality)[5:6],na.rm=T)
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
## 5     5   6    Ozone    28
## 6     5   7    Ozone    23
library(plyr)
## 
## Attaching package: 'plyr'
## The following objects are masked from 'package:reshape':
## 
##     rename, round_any
head(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
del=rbind(ddply(airquality,.(Month,Day),summarise,variable='Ozone',value=mean(Ozone,na.rm=T))
,     ddply(airquality,.(Month,Day),summarise,variable='Solar.R',value=mean(Solar.R,na.rm=T))
,     ddply(airquality,.(Month,Day),summarise,variable='Wind',value=mean(Wind,na.rm=T))
,     ddply(airquality,.(Month,Day),summarise,variable='Temp',value=mean(Temp,na.rm=T)))
head(del[!is.nan(del$value),])
##   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

formula가 2개일 때

cast를 활용해 월별 Ozone 자료의 개수를 봄. subset을 사용해 특정 값만 볼 수 있음

(formula=as.formula(paste(c(names(airquality[5]),'variable'),collapse = '~')))
## Month ~ variable
cast(aqm[aqm$variable=='Ozone',],formula,subset=variable)
## Warning in Ops.factor(!is.na(subset), subset): '&' not meaningful for
## factors
## Aggregation requires fun.aggregate: length used as default
##   Month  NA
## 1    NA 116
cast(aqm,formula,subset=variable=='Ozone')
## Aggregation requires fun.aggregate: length used as default
##   Month Ozone
## 1     5    26
## 2     6     9
## 3     7    26
## 4     8    26
## 5     9    29
cast(aqm,formula,subset=variable%in%c('Ozone'))
## Aggregation requires fun.aggregate: length used as default
##   Month Ozone
## 1     5    26
## 2     6     9
## 3     7    26
## 4     8    26
## 5     9    29
table(aqm[aqm$variable=='Ozone','Month'])
## 
##  5  6  7  8  9 
## 26  9 26 26 29

formula에 해당하는 자료에 함수를 적용. 아래는 cast를 활용해 월별 Ozone 자료의 평균을 봄

(cast(aqm[aqm$variable=='Ozone',],formula,mean))
##   Month    Ozone
## 1     5 23.61538
## 2     6 29.44444
## 3     7 59.11538
## 4     8 59.96154
## 5     9 31.44828

월별, 일별, 변수의 table형태로 출력 현재 Ozone변수만 추출해서 작업해서 ddply 와 차이가 없어보이나 여러개의 변수에 대해 보고싶은경우 ddply가 cast보다 코드가 길어짐에따라 가독성이 떨어짐

(formula=as.formula(paste(c(names(airquality[5:6]),'variable'),collapse = '~')))
## Month ~ Day ~ variable
#변수별로 Month~Daycast(airquality,Month~Day)
(cast(aqm[aqm$variable=='Ozone',],formula))
## , , variable = Ozone
## 
##      Day
## Month   1  2  3  4  5  6   7  8   9 10 11 12 13 14 15 16 17 18 19 20 21 22
##     5  41 36 12 18 NA 28  23 19   8 NA  7 16 11 14 18 14 34  6 30 11  1 11
##     6  NA NA NA NA NA NA  29 NA  71 39 NA NA 23 NA NA 21 37 20 12 13 NA NA
##     7 135 49 32 NA 64 40  77 97  97 85 NA 10 27 NA  7 48 35 61 79 63 16 NA
##     8  39  9 16 78 35 66 122 89 110 NA NA 44 28 65 NA 22 59 23 31 44 21  9
##     9  96 78 73 91 47 32  20 23  21 24 44 21 28  9 13 46 18 13 24 16 13 23
##      Day
## Month 23 24  25 26 27 28  29  30 31
##     5  4 32  NA NA NA 23  45 115 37
##     6 NA NA  NA NA NA NA  NA  NA NA
##     7 NA 80 108 20 52 82  50  64 59
##     8 NA 45 168 73 NA 76 118  84 85
##     9 36  7  14 30 NA 14  18  20 NA
cast(aqm[aqm$variable=='Ozone',],formula,mean)
## , , variable = Ozone
## 
##      Day
## Month   1   2   3   4   5   6   7   8   9  10  11  12 13  14  15 16 17 18
##     5  41  36  12  18 NaN  28  23  19   8 NaN   7  16 11  14  18 14 34  6
##     6 NaN NaN NaN NaN NaN NaN  29 NaN  71  39 NaN NaN 23 NaN NaN 21 37 20
##     7 135  49  32 NaN  64  40  77  97  97  85 NaN  10 27 NaN   7 48 35 61
##     8  39   9  16  78  35  66 122  89 110 NaN NaN  44 28  65 NaN 22 59 23
##     9  96  78  73  91  47  32  20  23  21  24  44  21 28   9  13 46 18 13
##      Day
## Month 19 20  21  22  23  24  25  26  27  28  29  30  31
##     5 30 11   1  11   4  32 NaN NaN NaN  23  45 115  37
##     6 12 13 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
##     7 79 63  16 NaN NaN  80 108  20  52  82  50  64  59
##     8 31 44  21   9 NaN  45 168  73 NaN  76 118  84  85
##     9 24 16  13  23  36   7  14  30 NaN  14  18  20 NaN
cast(aqm[aqm$variable=='Ozone',],formula,function(x){mean(x,na.rm=T)})
## , , variable = Ozone
## 
##      Day
## Month   1   2   3   4   5   6   7   8   9  10  11  12 13  14  15 16 17 18
##     5  41  36  12  18 NaN  28  23  19   8 NaN   7  16 11  14  18 14 34  6
##     6 NaN NaN NaN NaN NaN NaN  29 NaN  71  39 NaN NaN 23 NaN NaN 21 37 20
##     7 135  49  32 NaN  64  40  77  97  97  85 NaN  10 27 NaN   7 48 35 61
##     8  39   9  16  78  35  66 122  89 110 NaN NaN  44 28  65 NaN 22 59 23
##     9  96  78  73  91  47  32  20  23  21  24  44  21 28   9  13 46 18 13
##      Day
## Month 19 20  21  22  23  24  25  26  27  28  29  30  31
##     5 30 11   1  11   4  32 NaN NaN NaN  23  45 115  37
##     6 12 13 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
##     7 79 63  16 NaN NaN  80 108  20  52  82  50  64  59
##     8 31 44  21   9 NaN  45 168  73 NaN  76 118  84  85
##     9 24 16  13  23  36   7  14  30 NaN  14  18  20 NaN
ddply(airquality,.(Month,Day),summarise,value=mean(Ozone,na.rm=T))[,3]
##   [1]  41  36  12  18 NaN  28  23  19   8 NaN   7  16  11  14  18  14  34
##  [18]   6  30  11   1  11   4  32 NaN NaN NaN  23  45 115  37 NaN NaN NaN
##  [35] NaN NaN NaN  29 NaN  71  39 NaN NaN  23 NaN NaN  21  37  20  12  13
##  [52] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 135  49  32 NaN  64  40  77
##  [69]  97  97  85 NaN  10  27 NaN   7  48  35  61  79  63  16 NaN NaN  80
##  [86] 108  20  52  82  50  64  59  39   9  16  78  35  66 122  89 110 NaN
## [103] NaN  44  28  65 NaN  22  59  23  31  44  21   9 NaN  45 168  73 NaN
## [120]  76 118  84  85  96  78  73  91  47  32  20  23  21  24  44  21  28
## [137]   9  13  46  18  13  24  16  13  23  36   7  14  30 NaN  14  18  20
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
## 5     5   6    Ozone    28
## 6     5   7    Ozone    23
cast(aqm,Month~.|variable,mean,subset=variable%in%c('Ozone','Solar.R'))#list형식
## $Ozone
##   Month    (all)
## 1     5 23.61538
## 2     6 29.44444
## 3     7 59.11538
## 4     8 59.96154
## 5     9 31.44828
## 
## $Solar.R
##   Month    (all)
## 1     5 181.2963
## 2     6 190.1667
## 3     7 216.4839
## 4     8 171.8571
## 5     9 167.4333
## 
## $Wind
## NULL
## 
## $Temp
## NULL
cast(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
cast(aqm,Month~variable,mean,margins=c('grand_row','grand_col'))#행,열의 평균
##   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
cast(aqm,Day~Month,mean,subset=variable=='Ozone')#Ozone 월별 일별 값
##    Day   5   6   7   8   9
## 1    1  41 NaN 135  39  96
## 2    2  36 NaN  49   9  78
## 3    3  12 NaN  32  16  73
## 4    4  18 NaN NaN  78  91
## 5    5 NaN NaN  64  35  47
## 6    6  28 NaN  40  66  32
## 7    7  23  29  77 122  20
## 8    8  19 NaN  97  89  23
## 9    9   8  71  97 110  21
## 10  10 NaN  39  85 NaN  24
## 11  11   7 NaN NaN NaN  44
## 12  12  16 NaN  10  44  21
## 13  13  11  23  27  28  28
## 14  14  14 NaN NaN  65   9
## 15  15  18 NaN   7 NaN  13
## 16  16  14  21  48  22  46
## 17  17  34  37  35  59  18
## 18  18   6  20  61  23  13
## 19  19  30  12  79  31  24
## 20  20  11  13  63  44  16
## 21  21   1 NaN  16  21  13
## 22  22  11 NaN NaN   9  23
## 23  23   4 NaN NaN NaN  36
## 24  24  32 NaN  80  45   7
## 25  25 NaN NaN 108 168  14
## 26  26 NaN NaN  20  73  30
## 27  27 NaN NaN  52 NaN NaN
## 28  28  23 NaN  82  76  14
## 29  29  45 NaN  50 118  18
## 30  30 115 NaN  64  84  20
## 31  31  37 NaN  59  85 NaN
cast(aqm,Month~variable,mean,subset=variable=='Ozone')#Ozone 의 월별 평균
##   Month    Ozone
## 1     5 23.61538
## 2     6 29.44444
## 3     7 59.11538
## 4     8 59.96154
## 5     9 31.44828
cast(aqm,Month~variable,range)
##   Month Ozone_X1 Ozone_X2 Solar.R_X1 Solar.R_X2 Wind_X1 Wind_X2 Temp_X1
## 1     5        1      115          8        334     5.7    20.1      56
## 2     6       12       71         31        332     1.7    20.7      65
## 3     7        7      135          7        314     4.1    14.9      73
## 4     8        9      168         24        273     2.3    15.5      72
## 5     9        7       96         14        259     2.8    16.6      63
##   Temp_X2
## 1      81
## 2      93
## 3      92
## 4      97
## 5      93