Long-Form 그리고 Wide-Form
reshape2가 설치되었나? 만약 설치되지 않았다면 install.packages("reshape2")
> require(reshape2)
예에서는 R에 포함된 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
열 이름을 보면 Ozone, Solar.R, Wind, Temp, Month, Day
이 중에서 Month, Day는 인덱스이고 나머지는 공기질에 관한 데이터다.
데이터의 세부 항을 열을 기준으로 배치했다. 만약 해당하는 월/일에 측정치가 없으면 NA로 처리된다.
이제 wide-form을 long-form으로 고쳐보자.
> aql <- melt(airquality)
멜팅을 시키면
> head(aql)
variable value
1 Ozone 41
2 Ozone 36
3 Ozone 12
4 Ozone 18
5 Ozone NA
6 Ozone 28
Month, Day를 포함하여 전체 열이 다 값으로 고쳐진다. 이것은 우리가 원하는 결과가 아니다. 인덱스를 떼어서 처리하자.
> aql2 <- melt(airquality, id.vars=c("Month","Day"))
> head(aql2)
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
이제 Month, Day를 인덱스로 해서 variable에 각각의 공기질 측정 항목의 이름이, value에 값이 들어갔다. 해당 되지 않으면 NA.
변수와 값 이름은 별도로 정해줄 수 있다.
> aql3 <- melt(airquality, id.vars=c("Month","Day"),
+ variable.name="climate_variable",
+ value.name="climate_value")
> head(aql3)
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
Long-form을 wide-form으로 고쳐보자.
dcast()를 실행하면 data.frame의 long-form을 data.frame의 wide-form으로 고친다. 첫번째 인자는 데이터, 두번째는 고치기 위한 formula expression이다. Response variable (왼편 LHS)은 인덱스이고, 오른편(RHS)은 wide-form에 배치될 기준 명목 변수를 넣는다. 나머지 변수(여기서는 value)는 이에 따라 적절히 배열된다.
> aqw <- dcast(aql2,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
만약 인덱스를 Month만 주고, 월별 평균값으로 데이터를 고치려고 한다면 fun.aggregate에 평균 함수 mean을 대입하자. 그리고 일별 값은 빈 곳이 있을 수 있으니 결측값을 제거하는 na.rm 옵션을 TRUE로 설정한다.
> aqw2 <- dcast(aql2,Month ~ variable, fun.aggregate=mean, na.rm=TRUE)
> head(aqw2)
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
댓글
댓글 쓰기