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
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