[R] 연습

[R] reshape2 패키지 활용하기

Simon Yoon 2021. 12. 18. 17:27

지난 포스팅에서는 reshape 패키지의 melt()와 cast()함수를 사용하는 연습을 했었다.

주어진 데이터 셋을 탐색할 때 유용하게 사용할 수 있었다.

이번에는 reshape2 패키지의 함수들을 다루는 연습을 해보도록 하겠다. 내용적으로는 크게 다르지 않다.

사용하는 방법을 한번 더 익히고 또 다른 연습문제를 풀어본다고 생각하면 좋을  것 같다.

 

이번 포스팅에서도 insurance 데이터를 사용할 것이다.

insurance.csv
0.05MB
insurance 데이터의 일부

 

reshape2 패키지를 준비하고, 데이터를 불러온 후 5번째 열을 삭제하였다.

library(reshape2)
df <- read.csv("insurance.csv")
df <- df[, -5]

Q. 데이터 모양을 변환하고 피벗 테이블처럼 데이터를 다루고 싶다면?

A. reshape2 패키지의 melt()와 dcast(), acast() 함수를 사용하자.

 

사실 reshape2 패키지의 내용도 이전 포스팅의 reshape와 다르지 않다. 관련 내용은 아래의 링크에서 확인할 수 있다.

2021.12.17 - [[R] 연습] - [R] reshape 패키지 활용하기

 

reshape2 패키지의 함수들을 설명하자면,

melt() 함수는 데이터를 녹여 기존의 변수명을 행으로 표현하고 값은 value에 저장한다.

cast 함수는 변경된 형태의 데이터를 다시 기존처럼 여러 칼럼의 형태로 변환한다.

이때, 아웃풋이 data frame 형식을 원한다면 dcast() 함수를 사용하고,

vector/matrix/array 형태를 원한다면 acast() 함수를 사용하면 된다.

 

예시를 한번 보자.

mlt <- melt(df, id.vars = c("sex", "region"))

 

melt() 함수 결과

melt() 함수를 사용하면 id(식별자)를 중심으로 'variable'에 나머지 변수명, 'value'에 측정값이 구성된다.

 

이렇게 변형된 형태의 데이터프레임을 dcast()를 사용해서 원하는 형태로 다시 만들 수 있다.

dcast(mlt, sex~variable, mean)

 

dcast() 활용 예시

간단하게 위의 결과처럼 요약된 자료 형태로 다시 만들어 낼 수 있다.

 

여기서 더 나아가 dcast() 함수안에 subset = 을 사용하면 원하는 데이터만 출력할 수 있게 된다.

만약 지역(region)별 "age", "bmi", "children"의 평균을 알고 싶다거나,

성별(sex)이 여자인 사람들의 평균에 대해서만 알고 싶다면 다음과 같이 작성할 수 있다.

# needed to access . function
library(plyr)

dcast(mlt, region~variable, subset = .(variable==c("age", "bmi", "children")), mean)
dcast(mlt, region~variable, subset = .(sex == "female"), mean)

 

dcast() 함수 활용 예시

그러면 위와 같은 결과를 얻을 수 있을 것이다.

 

 

★ 예시문제1)

ChickWeight 데이터에서 (참고: ChickWeight 데이터는 R에서 ChickWeight로 바로 불러올 수 있는 데이터이다)

weight a numeric vector giving the body weight of the chick (gm).
Time a numeric vector giving the number of days since birth when the measurement was made.
Chick an ordered factor with levels 18 < ... < 48 giving a unique identifier for the chick.
The ordering of the levels groups chicks on the same diet together and orders them according to their final weight (lightest to heaviest) within diet.
Diet a factor with levels 1, ..., 4 indicating which experimental diet the chick received.

1) 시간(Time)에 따른 전체 병아리 무게(weight) 평균의 변화

   Time    weight
1     0  41.06000
2     2  49.22000
3     4  59.95918
...
12   21 218.68889

 

2) 전체 기간안에서 식단(Diet)별 병아리들의 평균 무게(weight)

 

3) 식단(Diet)별 병아리들의 평균 무게(weight)를 구하는데, 단 10일차 이후의 각 일차(Time) 별로 평균 무게를 구하여라.

  Diet       12 ...       21
1    1 108.5263 ... 177.7500
2    2 131.3000 ... 214.7000
3    3 144.4000 ... 270.3000
4    4 151.4000 ... 238.5556

 

 

 

예시답안)

chick_m <- melt(ChickWeight, id=2:4, na.rm = T)

dcast(chick_m, Time ~ variable, mean) # average effect of time
dcast(chick_m, Diet ~ variable, mean) # average effect of diet
dcast(chick_m, Diet ~ Time, subset = .(Time > 10), mean) # average effect of diet & time

해당 예시는 https://cran.r-project.org/web/packages/reshape2/reshape2.pdf 에서 확인할 수 있습니다.

 

 

※ 참고: 코드 예시는 해당 함수를 활용하기 위한 방법으로 제시한 것입니다. 같은 결과 도출을 위한 다른 방법이 존재할 수도 있습니다.

'[R] 연습' 카테고리의 다른 글

[R] 군집분석(k-means clustering편)  (0) 2021.12.26
[R] 차원축소(MDS편)  (0) 2021.12.19
[R] reshape 패키지 활용하기  (0) 2021.12.17
[R] 정규화(Normalization)편  (0) 2021.12.12
[R] 차원축소 (PCA편)  (2) 2021.12.11