여러 가지 이유로 데이터를 정제하다 보면 서로 다른 길이의 데이터를 합치고 붙여야 하는 경우가 자주 생깁니다. 관측치의 갯수가 서로 다른 경우에도 물론 여러 가지 옵션을 주면서 서로 붙여 나갈 수 있습니다. merge 함수와 dplyr 패키지 모두 비슷한 기능을 제공합니다. 우선 서로 다른 길이의 데이터 셋을 만든 후 합치는 예제를 간단히 진행해 보겠습니다. 역시 앞서 본 다이아몬드 예제에서 10개를 추출한 후 1:8까지, 3:10까지 두 개의 데이터 셋을 만들고 변수도 따로 뽑아 보겠습니다.
library("dplyr")
library("ggplot2")
set.seed(3311)
diamonds1<-sample 10="" diamonds="" nrow="" span="">-sample>
D1<-diamonds diamonds1="" span="">-diamonds>
D1<-d1>% mutate(id = row_number())-d1>
D1
D2<-d1 c="" carat="" clarity="" color="" cut="" id="" span="">-d1>
D3<-d1 c="" carat="" cut="" depth="" id="" price="" span="">-d1>
D2
D3
서로 행과 열이 서로 다르지만 id 를 기준으로 합칠 수 있을 것으로 보입니다. 이 경우 기본적으로 merge에서는 4가지 경우의 수가 있습니다.
merge(D2,D3, by="id")
merge(D2,D3, by="id", all.x = TRUE)
merge(D2,D3, by="id", all.y = TRUE)
merge(D2,D3, by="id", all = TRUE)
기본은 all = FALSE로 양쪽 데이터 프레임에서 겹치는 관측값만 선택합니다. 그러면 3-8까지 관측치가 나오겠죠. all.x=TRUE는 순서대로 X,Y 데이터에서 X 값을 모두 살리는 것이고 all.y=TRUE는 Y값을 살리는 것입니다. 따라서 1-8 관측치, 그리고 3-10관측치 두 가지 데이터 셋이 나오게 됩니다. all = TRUE 는 모든 값을 살리는 것입니다. 이 때 누락된 값은 모두 NA (결측값)으로 들어가게 됩니다.
당연히 dplyr 패키지에서도 같은 기능을 제공합니다. left_join은 all.x=TRUE와 같은 결과를 반환합니다. right_join은 all.y=TRUE, inner_join은 all=FALSE (기본값), full_join은 all=TRUE 값입니다.
left_join(D2,D3, by="id")
right_join(D2,D3, by="id")
inner_join(D2,D3, by="id")
full_join(D2,D3, by="id")
merge와 dplyr의 차이점은 여러 가지 다른 기능과 함께 사용할 수 있느냐 아니냐의 차이로 볼 수 있습니다. 한번에 데이터를 변환하려면 dplyr 쪽이 더 유리한 경우가 많지만 그렇다고 해서 merge가 불필요한 기능은 아닙니다. merge도 생각보다 다양한 옵션을 제공하고 있습니다.
댓글
댓글 쓰기