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

댓글

이 블로그의 인기 게시물

Bradley-Terry Model: paired comparison models

xlwings tutorial - 데이터 계산하여 붙여 넣기

R에서 csv 파일 읽는 법