Translate

2018년 7월 12일 목요일

데이터 가공 및 분석 - dplyr 패키지 (3)



 dplyr 패키지의 여러 기능 가운데 하나는 데이터를 합치는 것입니다. 이는 R의 기본 기능인 merge와 같은 기능이지만, dplyr 패키지가 여러 가지 기능을 같이 사용할 수 있어 더 다양한 응용이 가능합니다. 하지만 그렇다고 해서 merge의 기능이 적은 것도 아닙니다. 대부분의 경우 merge를 통해서 원하는 데이터 프레임 합치기가 가능하지만, dplyr가 좀 더 다양한 응용을 제공할 수 있다는 점이 차이점입니다. 기본적인 데이터 합치기 기능에 대해서 설명해 보겠습니다. 


 우선 다이아몬드 자료에서 10개만 추출한 후 이를 자료별로 나눠보겠습니다. 그런데 이렇게 나눈 데이터간에 합체를 위해서 일단 먼저 데이터 프레임에 각 관측값에 일련번호 (id)를 매겨보겠습니다. 방법은 간단합니다. dplyr 패키지의 mutate 기능을 이용해 각 열에 번호를 붙이는 것입니다. 


library("dplyr")
library("ggplot2")

set.seed(3311)
diamonds1<-sample 10="" diamonds="" nrow="" span="">
D1<-diamonds diamonds1="" span="">

D1<-d1>% mutate(id = row_number())
D1





 id라는 새로운 행이 생기면서 1-10까지 번호가 생겼습니다. 이는 상당히 유용한 기능 가운데 하나입니다. 아무튼 다음으로 넘어가서 이를 D2/3라는 두 개의 데이터 프레임으로 쪼갠 후 merge와 dplyr의 left_join 기능을 이용해서 합쳐보겠습니다. 이름에서 짐작할 수 있듯이 왼쪽 뿐 아니라 좌우, 위아래로 데이터 프레임을 붙일 수도 있습니다. 하지만 대개의 데이터 프레임에서는 merge와 마찬가지로 주로 왼쪽으로 붙이는 방식으로 데이터를 합치게 됩니다. 아무튼 다음의 문법으로 데이터를 쪼갠 후 다시 붙이겠습니다. 참고로 같은 열과 행을 지닌 경우 rbind, cbind 기능으로 간단히 자르고 붙일 수 있다는 것 역시 소개드립니다. 


D2<-d1>%select(id,carat,cut,color,clarity)
D3<-d1>%select(id,carat,depth,price)
D2
D3


cbind(D2,D3)

merge(D2,D3, by="id")

left_join(D2,D3, by="id")





 결과를 보면 cbind는 그냥 두 개의 같은 길이의 데이터 프레임을 연결하므로 id라는 기준값이 그대로 살아있습니다. 만약 열의 길이가 다르면 cbind 기능은 사용할 수 없습니다. 따라서 기능이 매우 제한적이나 의외로 많이 쓰는 기능 가운데 하나입니다. 


 merge와 left_join은 사실상 같은 결과를 보여줍니다. 여기서 주목할 점은 합치는 기준 값이 되는 id는 중복되지 않지만, carat은 중복되는 행이므로 어디서 왔는지 표시하기 위해 x, y 값으로 표시를 했다는 점입니다. 만약 이런 내용이 거추장스럽다면 아예 중복되는 행을 뺀 데이터끼리 합치거나 혹은 두 개의 값을 기준으로 합치면 됩니다. 


 merge와 left_join은 모두 복수의 변수(variable) 혹은 행을 기준으로 데이터를 합칠 수 있는 기능을 제공합니다. 사실 실무에서 합치려는 데이터 중에는 확인을 위한 id 번호가 있는 경우도 있으나 그렇지 않고 스스로 각 관측값이 섞이지 않게 합쳐야 하는 경우도 많이 생깁니다. 위의 샘플 데이터으 경우 만약 carat 값을 기준으로 데이터를 합치면 0.91 캐럿인 데이터가 두 개라는 문제가 생깁니다. 이 경우 cut 데이터가 같이 있다면 중복 데이터의 기준으로 삼을 수 있습니다. 실제로 해보겠습니다. by=c("carat","cut") 방식으로 복수의 행을 기준으로 삼을 수 있습니다. 


D6<-d1 c="" carat="" clarity="" color="" cut="" span="">
D7<-d1 c="" carat="" cut="" depth="" price="" span="">

merge(D6,D7, by=c("carat","cut"))

left_join(D6,D7, by=c("carat","cut"))





 참고로 직접 해보면 알겠지만, 만약 기준값에 중복이 있으면 merge나 left_join 모두 2x2의 가능성에 맞춰 보여주는 것이 기본입니다. 따라서 관측값이 10개에서 12개로 늘어납니다. 물론 이렇게 되는 경우는 원치 않을 테니 기준값에 문제가 없는지 잘 살펴야 합니다. 


 여기서는 결측값이 없는 데이터를 기준으로 했지만, 사실 현실에서는 빠진 데이터끼리 붙이는 경우가 흔합니다. 이 경우 어떻게 할지 역시 다시 이야기해 보겠습니다. 

댓글 없음:

댓글 쓰기