티스토리 뷰

 

 

분석을 하다 보면 데이터 셋의 재구조화 작업을 수도 없이 해야 합니다. 이때 꼭 알고 있어야 하는 reshape 패키지의 cast() 함수에 대해 살펴보겠습니다.


분석에 사용할 reshape 패키지를 다운받고 라이브러리를 불러옵니다.

install.packages(reshape2)
library(reshape2)

 

우선 데이터 셋을 만듭니다. 4가지 섹션에 A, B 두 샘플의 값으로 간단하게 만들었습니다.

> section <- rep(c('section-1', 'section-2', 'section-3', 'section-4'), times=2)
> sample <- rep(c('A','B'), each=4)
> value <- round(rnorm(8 , 5 , 10))
> data <- data.frame(section, sample, value)
> data
    section sample value
1 section-1      A     5
2 section-2      A    -1
3 section-3      A   -15
4 section-4      A    -2
5 section-1      B     9
6 section-2      B    -2
7 section-3      B    -1
8 section-4      B     3

이 데이터 셋을 cast를 이용해서 section별 sample의 value 값을 볼 수 있습니다.

물론 반대로 sample별 section의 value 값도 볼 수 있습니다.

> cast(data, section~sample)
    section   A  B
1 section-1   5  9
2 section-2  -1 -2
3 section-3 -15 -1
4 section-4  -2  3

> cast(data, sample~section)
  sample section-1 section-2 section-3 section-4
1      A         5        -1       -15        -2
2      B         9        -2        -1         3

이때 함수(fun)에 length를 넣어 확인해보면 각 value가 1개씩 존재하는것을 알 수 있습니다. 이렇게 되면 fun에 다른 함수를 넣어도 값이 하나뿐이어서 별다른 의미는 없게 됩니다.

> cast(data, section~sample, fun=length)
    section A B
1 section-1 1 1
2 section-2 1 1
3 section-3 1 1
4 section-4 1 1

이해가 쉽게 도식화 해보면 다음과 같습니다.

 


그럼 한단계 더 나아가서 level을 추가한 데이터 셋을 만들어보겠습니다.

> section <- rep(c('section-1','section-2'), each=8)
> level <- rep(c("level-1" , "level-2" , "level-3", "level-4") , times=4)
> sample <- rep(rep(c('A','B'), each=4), times=2)
> value <- round(rnorm(16 , 5 , 10))
> data <- data.frame(section, level, sample, value)
> data
     section   level sample value
1  section-1 level-1      A     5
2  section-1 level-2      A     5
3  section-1 level-3      A     7
4  section-1 level-4      A     8
5  section-1 level-1      B     1
6  section-1 level-2      B    12
7  section-1 level-3      B    -9
8  section-1 level-4      B     9
9  section-2 level-1      A     9
10 section-2 level-2      A    -2
11 section-2 level-3      A     6
12 section-2 level-4      A     6
13 section-2 level-1      B    22
14 section-2 level-2      B    13
15 section-2 level-3      B    10
16 section-2 level-4      B     4

앞에서 했던 방식과 동일하게 cast를 이용해서 section별 sample을 진행하면 무언가 다른 결과가 나온 것을 알 수 있는데요. 이는 fun=length를 이용한 결과와 같습니다. level 변수가 빠졌기 때문에 value 값을 불러올 수가 없고 fun적용 값을 가져오게 되는데요, 따로 입력하지 않을 경우 아래와 같이 default로 length가 적용됩니다.

> cast(data, section~sample)
Aggregation requires fun.aggregate: length used as default
    section A B
1 section-1 4 4
2 section-2 4 4

> cast(data, section~sample, fun=length)
    section A B
1 section-1 4 4
2 section-2 4 4

그래서 fun에 다른 함수를 넣어 결과를 확인 할 수 있습니다.

> cast(data, section~sample, fun=mean)
    section    A     B
1 section-1 6.25  3.25
2 section-2 4.75 12.25

> cast(data, section~sample, fun=min)
    section  A  B
1 section-1  5 -9
2 section-2 -2  4


그럼 앞에서 사용안한 level변수를 추가해주면 다음과 같은 결과를 볼 수 있습니다. fun값을 입력을 안 했는데 value값이 나왔고, length를 입력해서 확인해보면 각 1개씩 요소가 들어간 결과를 볼 수 있습니다.

> cast(data, section+level~sample)
    section   level  A  B
1 section-1 level-1  5  1
2 section-1 level-2  5 12
3 section-1 level-3  7 -9
4 section-1 level-4  8  9
5 section-2 level-1  9 22
6 section-2 level-2 -2 13
7 section-2 level-3  6 10
8 section-2 level-4  6  4

> cast(data, section+level~sample, fun=length)
    section   level A B
1 section-1 level-1 1 1
2 section-1 level-2 1 1
3 section-1 level-3 1 1
4 section-1 level-4 1 1
5 section-2 level-1 1 1
6 section-2 level-2 1 1
7 section-2 level-3 1 1
8 section-2 level-4 1 1


cast에서 subset 기능을 사용할 수 있는데요 원하는 변수로 조건을 주면 그에 해당하는 부분만 데이터를 얻을 수 있습니다.

> cast(data, section+level~sample, subset=level=='level-1')
    section   level A  B
1 section-1 level-1 5  1
2 section-2 level-1 9 22

> cast(data, section+level~sample, subset=level==c('level-1', 'level-4'))
    section   level A  B
1 section-1 level-1 5  1
2 section-1 level-4 8  9
3 section-2 level-1 9 22
4 section-2 level-4 6  4

포스팅이 데이터 분석에 도움이 되었으면 좋겠습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함