with reshape2
행렬 형태의 데이터를 다루다 보면 데이터의 구조를 바꿔 주어야 할 때가 있다.
예를 들면, 열(column)이 많은 넓은(wide) 형태의 행렬을 행(row)이 많은 긴(long) 형태로 바꾸어야 하거나 그 반대의 경우
그럴 때 R에서 제공하는 패키지 중에서 'reshape2'를 쓰면 좋다. 먼저, 패키지를 설치하고 불러와 보자.
> install.packages('reshape2')
> library(reshape2)
SNS 데이터를 예로 들어 설명해 보겠다. 아래의 표처럼 각 사용자가 다른 사용자를 태그한 경우를 생각해 보자. A는 F와 G를 각각 1번씩 태그했고, B는 H를 1번 태그했으며 C 역시 H를 1번 태그했다는 뜻이다.
아래 표를 다시 보자. A와 B의 경우, 첫 번째 칼럼(User1)에도 있고, 두 번째 칼럼(User2)에도 들어가 있다. 지저분하다. 이 표를 깔끔하게 정리해 보자.
이때 사용할 함수는 'dcast'로, 이는 아래로 긴 행렬(long matrix)을 옆으로 넓은 행렬(wide matrix)로 바꿔줄 때 사용하는 함수다. 아래 표현에서 'data'는 wide한 포맷으로 바꾸어줄 데이터프레임의 이름, 'User1'은 각 행에 들어갈(즉, 1열) 변수명, 'User2'는 각 열에 들어갈(즉, 1행) 변수명, 'sum'은 'User1'과 'User2' 가 함께 존재할 때의 'Count' 값의 합이다.
> wide <- dcast(data, User1 ~ User2, sum)
wide를 출력해 보면 아래와 같이 옆으로 넓어진 결과를 확인할 수 있으며, 중복되는 값이 깔끔하게 정리된 것을 볼 수 있다.
> wide
A B F G H
1 A 0 0 1 1 0
2 B 0 0 0 0 1
3 C 0 0 0 0 1
4 D 1 0 0 0 0
5 E 0 1 0 0 0
반대로 wide 포맷을 long 포맷을 바꾸고자 할 때는 'melt' 함수를 사용하면 된다.
(제목 배경 이미지 출처)