티스토리 뷰

reshape2

cast Long Format to Wide Format
melt Wide Format to Long Format


옆으로 길게 나열되어있는(wide format) 데이터를 아래로 길게 이어는(long format) 데이터로 바꿔주는 melt 함수의 사용법에 대해 보겠습니다.


우선 reshape2 패키지를 설치하고 불러와주세요. 

> install.packages(reshape2)
> library(reshape2)

 

그리고 연습에 이용할 간단한 데이터를 만들어주었습니다. 간단한 데이터 셋을 이용해 전체적인 큰 틀을 이해하고 나면, 그 다음에 R에서 제공해주는 다양한 데이터 셋에 적용해 연습해보시기 바랍니다.

> section <- c('section-1', 'section-2', 'section-3')
> year <- c(1999,2004,2020)
> sample_1 <- round(rnorm(3, 5, 10))
> sample_2 <- round(rnorm(3, 5, 10))
> sample_3 <- round(rnorm(3, 5, 10))
> sample_4 <- round(rnorm(3, 5, 10))

간단한 데이터를 이용한 melt 함수 적용

4개의 sample별로 value 값을 가지는 간단한 데이터 셋을 만들어주었습니다. 지금 이 데이터는 옆으로 각 sample이 나열되어있는 wide format입니다.

> data <- data.frame(sample_1, sample_2, sample_3, sample_4)
> data
  sample_1 sample_2 sample_3 sample_4
1       -9        3        4        2
2       10       -3       -2        6
3        1       -9       14       12

이 데이터 셋에 melt 를 적용하면 다음과 같은 long format 데이터를 얻을 수 있습니다.

> data_melt <- melt(data)
No id variables; using all as measure variables
> data_melt
   variable value
1  sample_1    -9
2  sample_1    10
3  sample_1     1
4  sample_2     3
5  sample_2    -3
6  sample_2    -9
7  sample_3     4
8  sample_3    -2
9  sample_3    14
10 sample_4     2
11 sample_4     6
12 sample_4    12

 


melt 함수의 응용 1: 변수 1개 추가

기존에 이용한 데이터에 section 변수를 추가한 데이터 셋을 만들어주었습니다. 역시 이 데이터도 옆으로 각 sample이 나열되어있는 wide format입니다.

> data <- data.frame(section, sample_1, sample_2, sample_3, sample_4)
> data
    section sample_1 sample_2 sample_3 sample_4
1 section-1       -9        3        4        2
2 section-2       10       -3       -2        6
3 section-3        1       -9       14       12

이제는 Section 이라는 변수가 생겼으니 해당변수에 대한 정보를 melt 함수에 입력해주어야 합니다. 이때는 id.vars 를 이용하면 됩니다. 그러면 variable과 value값에 대한 long format 결과를 확인할 수 있습니다. 

> data_melt <- melt(data, 
+      id.vars=c('section'))
> data_melt
     section variable value
1  section-1 sample_1    -9
2  section-2 sample_1    10
3  section-3 sample_1     1
4  section-1 sample_2     3
5  section-2 sample_2    -3
6  section-3 sample_2    -9
7  section-1 sample_3     4
8  section-2 sample_3    -2
9  section-3 sample_3    14
10 section-1 sample_4     2
11 section-2 sample_4     6
12 section-3 sample_4    12

여기서 자동으로 열 이름에 variable, value이 할당이 되는데요, 이를 수정해줄 수 있습니다. variable.name value.name을 이용하면 됩니다.

> data_melt <- melt(data, 
+      id.vars=c('section'),
+      variable.name="sample",
+      value.name='value')
> data_melt
     section   sample value
1  section-1 sample_1    -9
2  section-2 sample_1    10
3  section-3 sample_1     1
4  section-1 sample_2     3
5  section-2 sample_2    -3
6  section-3 sample_2    -9
7  section-1 sample_3     4
8  section-2 sample_3    -2
9  section-3 sample_3    14
10 section-1 sample_4     2
11 section-2 sample_4     6
12 section-3 sample_4    12

 

 

melt 함수의 응용 2: 변수 2개 추가

기존에 이용한 데이터에 section과 year 변수 2개를 추가한 데이터 셋을 만들어주었습니다. 역시 이 데이터도 옆으로 각 sample이 나열되어있는 wide format입니다.

> data <- data.frame(section, year, sample_1, sample_2, sample_3, sample_4)
> data
    section year sample_1 sample_2 sample_3 sample_4
1 section-1 1999       -9        3        4        2
2 section-2 2004       10       -3       -2        6
3 section-3 2020        1       -9       14       12

변수가 두가지일때에도 다음과 같이 변수에 대한 정보를 melt 함수에 입력해주면 됩니다. 이때는 id.vars 를 이용하면 됩니다. 그러면 variable과 value값에 대한 long format 결과를 확인할 수 있습니다.

> data_melt <- melt(data, 
+      id.vars=c('section', 'year'))
> data_melt
     section year variable value
1  section-1 1999 sample_1    -9
2  section-2 2004 sample_1    10
3  section-3 2020 sample_1     1
4  section-1 1999 sample_2     3
5  section-2 2004 sample_2    -3
6  section-3 2020 sample_2    -9
7  section-1 1999 sample_3     4
8  section-2 2004 sample_3    -2
9  section-3 2020 sample_3    14
10 section-1 1999 sample_4     2
11 section-2 2004 sample_4     6
12 section-3 2020 sample_4    12

여기서도 variable.name value.name을 이용해서 열이름을 수정하면 이용하면 됩니다.

> data_melt <- melt(data, 
+      id.vars=c('section', 'year'), 
+      variable.name="sample", 
+      value.name='value')
> data_melt
     section year   sample value
1  section-1 1999 sample_1    -9
2  section-2 2004 sample_1    10
3  section-3 2020 sample_1     1
4  section-1 1999 sample_2     3
5  section-2 2004 sample_2    -3
6  section-3 2020 sample_2    -9
7  section-1 1999 sample_3     4
8  section-2 2004 sample_3    -2
9  section-3 2020 sample_3    14
10 section-1 1999 sample_4     2
11 section-2 2004 sample_4     6
12 section-3 2020 sample_4    12

 

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함