ADsP R기초

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

reshape

시작은 reshape인데요. 해들리 위컴이라는 프로그래머가 만든 tidyverse 시리즈 중 하나입니다. tidyverse에 대해서 자세히 알고 싶다면 R for DataScience (영어 전자책)을 추천합니다.

 

reshape는 이름대로 데이터 프레임의 모양을 바꾸는 패키지입니다. 크게 두 가지 함수를 쓰는데요. 쇳덩이처럼 녹이는 melt() 거푸집에 부어주는 cast()입니다.

french_fries 데이터

이번 실슬에서는 해들리 위컴이 reshape2에 내장해둔 french_fries 데이터를 사용하겠습니다. 일단 데이터 모양부터 살펴보죠. 늘 그렇듯이...

> library(reshape2) #라이브러리를 불러오고
> data("french_fries") #데이터를 불러오고
> head(french_fries)  #head()함수를 써서 모양을 살펴봅니다.
   time treatment subject rep potato buttery grassy rancid painty
61    1         1       3   1    2.9     0.0    0.0    0.0    5.5
25    1         1       3   2   14.0     0.0    0.0    1.1    0.0
62    1         1      10   1   11.0     6.4    0.0    0.0    0.0
26    1         1      10   2    9.9     5.9    2.9    2.2    0.0
63    1         1      15   1    1.2     0.1    0.0    1.1    5.1
27    1         1      15   2    8.8     3.0    3.6    1.5    2.3

이 데이터는 간단히 말해 식용류의 종류(treatment)에 따라 감자튀김맛이 어떻게 변하는지 알아보는 데이터입니다. time은 몇 주차 실험인지 나타내고요, subject는 실험 대상자의 번호입니다.

rep는 설문 회차입니다. 맛이 어떤지 두 번 물어보거든요. 당연히 두 번 물어봐도 똑같이 답할 것 같지만, 먹고 나서 곰곰히 생각해보면 맛을 또 다르게 느낄 수도 있는 법입니다. 실제로 1회차랑 2회차는 꽤 차이가 납니다. 3번 실험자는 처음 물어봤을 때는 감자맛(potato)은 조금 밖에 안 나는데 이상한 냄새(painty)가 난다고 답했지만... 다시 물어보자 감자 맛이 엄청 나고 신맛(rancid)도 아주 조금 난다고 답했습니다.

potato부터 painty까지는 이렇듯 맛을 나타내는 변수입니다. buttery는 버터맛, grassy는 풀맛입니다.

melt()함수로 녹이기

그러면 이제 다시 reshape2로 돌아가서 melt()로 이 데이터 프레임을 녹여내 봅시다. melt()함수를 쓰면 id로 지정해준 열을 제외하고, 나머지 데이터 '열'들이 쪼개져서 각각 하나의 행이 되어버립니다. 백문이 불여일견, 한 번 보시죠.

> melted_french_fries <- melt(french_fries, id=c("time", "treatment", "subject", "rep"), na.rm = T)
> head(melted_french_fries)
  time treatment subject rep variable value
1    1         1       3   1   potato   2.9
2    1         1       3   2   potato  14.0
3    1         1      10   1   potato  11.0
4    1         1      10   2   potato   9.9
5    1         1      15   1   potato   1.2
6    1         1      15   2   potato   8.8
> tail(melted_french_fries)
     time treatment subject rep variable value
3475   10         3      63   1   painty   3.3
3476   10         3      63   2   painty   7.3
3477   10         3      78   1   painty   1.3
3478   10         3      78   2   painty   1.4
3479   10         3      86   1   painty  10.5
3480   10         3      86   2   painty   9.4

열의 개수가 확 줄었습니다. id로 넣어준 time, treatment, subject, rep는 그대로지만요. 각 열을 variable이라 하고 그 값을 value라 하는 수 많은 행들로 쪼개졌기 때문입니다. 그래서 초반에는 potato 변수지만, 막판에는 painty 변수가 나오는 거죠.

cast함수로 틀에 넣어 굳히기

cast 함수를 이용하면 이렇게 바리바리 찢고 녹여버린 데이터를 다시 원하는 모양으로 만들 수 있습니다. 혹시 cast()함수가 작동을 안 한다면 저처럼 dcast함수를 쓰면 됩니다.

예를 들어 원래 목표대로 식용류 종류(treatment)에 따라서 어떤 맛이 나는지 보고 싶다면 다음과 같이 하면 됩니다.

> dcast(melted_french_fries, treatment ~ variable, mean)
  treatment   potato  buttery    grassy   rancid   painty
1         1 6.887931 1.780087 0.6491379 4.065517 2.583621
2         2 7.001724 1.973913 0.6629310 3.624569 2.455844
3         3 6.967965 1.717749 0.6805195 3.866667 2.525541

treatment ~ variable 라고 하면 treatment와 각 variable의 관계를 알고 싶다는 뜻입니다. 한편 mean은 평균을 구해달라는 뜻이지요.

여기에 sum을 넣으면 합계를 구해줍니다.

> dcast(melted_french_fries, treatment ~ variable, sum)
  treatment potato buttery grassy rancid painty
1         1 1598.0   411.2  150.6  943.2  599.4
2         2 1624.4   454.0  153.8  840.9  567.3
3         3 1609.6   396.8  157.2  893.2  583.4

연습 문제

dcast 함수에 subject ~ variable라 넣으면 어떻게 될까요? 이게 무슨 뜻일까요?

  • 봤어요 (0명)

댓글

댓글 본문
버전 관리
Taehee Kim
현재 버전
선택 버전
graphittie 자세히 보기