'merge()'에 해당되는 글 1건

  1. 2015.07.27 R 데이터 프레임 결합 : rbind(), cbind(), merge() (37)

분석을 진행하다 보면 하나의 데이터 셋에서 변수를 생성, 제거, 변환하는 작업 못지않게 새로운 데이터 셋을 기존의 데이터 셋과 결합하는 작업 또한 빈번합니다.  이번 포스팅에서는 rbind(), cbind(), merge()함수를 활용해서 데이터 프레임 결합하는 방법에 대해서 알아보도록 하겠습니다.

 

예전에 포스팅 했던 R 행렬 함수(☞ 바로가기) 에서 rbind(), cbind()를 다루었던 적이 있는데요, 데이터 프레임도 행렬에서의 데이터 결합과 동일하며, 복습하는 차원에서 한번 더 짚어 보고, key값 기준으로 결합하는 merge()에 대해서 추가로 알아보도록 하겠습니다.

 

 

 R 데이터 프레임 결합 : rbind(), cbind(), merge()

 

[ rbind(), cbind(), merge() 함수 비교 ]

 

 

 

(1) 행 결합 (위 + 아래) : rbind(A, B)

 

먼저 실습에 사용할 데이터 프레임 두개(cust_mart_1, cust_mart_2)를 생성해 보겠습니다.

 

## 데이터 프레임 생성 

cust_id <- c("c01","c02","c03","c04")
last_name <- c("Kim", "Lee", "Choi", "Park")
cust_mart_1 <- data.frame(cust_id, last_name)

cust_mart_1  
# cust_id last_name 
# 1 c01 Kim 
# 2 c02 Lee 
# 3 c03 Choi 
# 4 c04 Park 



cust_mart_2 <- data.frame(
    cust_id = c("c05", "c06", "c07"), 
    last_name = c("Bae", "Kim", "Lim"))
    
cust_mart_2  
# cust_id last_name 
# 1 c05 Bae 
# 2 c06 Kim 
# 3 c07 Lim

 

다음으로 두개의 데이터 프레임(cust_mart_1, cust_mart_2)을 세로 행 결합 (위 + 아래) 해보도록 하겠습니다.

 

## (1) 행 결합 (위 + 아래) rbind(A, B) 
cust_mart_12 <- rbind(cust_mart_1, cust_mart_2) 


cust_mart_12
# cust_id last_name 
# 1 c01 Kim 
# 2 c02 Lee 
# 3 c03 Choi 
# 4 c04 Park 
# 5 c05 Bae 
# 6 c06 Kim 
# 7 c07 Lim

 

rbind()는 row bind 의 약자입니다. rbind()를 무작정 외우려고 하지 마시고, row bind의 약자라는걸 이해하시면 됩니다. 

위의 행 결합 rbind()를 하기 위해서는 결합하려는 두개의 데이터 셋의 열의 갯수와 속성, 이름이 같아야만 합니다. 

 

아래의 예시 처럼 만약 칼럼의 갯수가 서로 다르다면 (cust_mart_12는 열이 2개, cust_mart_3은 열이 3개) 열의 갯수가 맞지 않는다고 에러 메시지가 뜹니다.

 

cust_mart_3 <- data.frame(
    cust_id = c("c08", "c09"), 
    last_name = c("Lee", "Park"), 
    gender = c("F", "M")) 
    
cust_mart_3  
# cust_id last_name gender 
# 1 c08 Lee F 
# 2 c09 Park M


## -- error
rbind(cust_mart_12, cust_mart_3) 
# Error in rbind(deparse.level, ...) 
# : numbers of columns of arguments do not match

 

아래의 예처럼 칼럼의 이름(cust_mart_12 는 cust_id, last_name 인 반면, cust_mart_4는 cust_id, first_name)이 서로 다르다면 역시 에러가 납니다.

 

cust_mart_4 <- data.frame(
    cust_id = c("c10", "c11"), 
    first_name = c("Kildong", "Yongpal"))
    
cust_mart_4
# cust_id first_name 
# 1 c10 Kildong 
# 2 c11 Yongpal 


## -- error
rbind(cust_mart_12, cust_mart_4) 
# Error in match.names(clabs, names(xi)) 
# : names do not match previous names 

 

 

(2) 열 결합 (왼쪽 + 오른쪽) : cbind(A, B)

 

## -- (2) 열 결합 cbind(A, B)
cust_mart_5 <- data.frame(
    age = c(20, 25, 19, 40, 32, 39, 28), 
    income = c(2500, 2700, 0, 7000, 3400, 3600, 2900))
    
cust_mart_12  
# cust_id last_name 
# 1 c01 Kim 
# 2 c02 Lee 
# 3 c03 Choi 
# 4 c04 Park 
# 5 c05 Bae 
# 6 c06 Kim 
# 7 c07 Lim 

cust_mart_5  
# age income 
# 1 20 2500 
# 2 25 2700 
# 3 19 0 
# 4 40 7000 
# 5 32 3400 
# 6 39 3600 
# 7 28 2900


cust_mart_125 <- cbind(cust_mart_12, cust_mart_5)

cust_mart_125  
# cust_id last_name age income 
# 1 c01 Kim 20 2500 
# 2 c02 Lee 25 2700 
# 3 c03 Choi 19 0 
# 4 c04 Park 40 7000 
# 5 c05 Bae 32 3400 
# 6 c06 Kim 39 3600 
# 7 c07 Lim 28 2900

 

cbind()는 column bind의 약자입니다.   cbind()도 열 결합을 하려고 하면 서로 결합하려는 두 데이터셋의 관측치가 행이 서로 동일 대상이어야만 하고, 행의 갯수가 서로 같아야만 합니다

 

만약, cbind()를 하는데 있어 행의 갯수가 서로 다르다면 아래의 예처럼 에러 메시지가 뜹니다.

 

cust_mart_6 <- data.frame(
    age = c(34, 50), 
    income = c(3600, 5100))
    
cust_mart_6 
# age income 
# 1 34 3600 
# 2 50 5100 

## -- error: different number of rows
cbind(cust_mart_125, cust_mart_6) 
# Error in data.frame(..., check.names = FALSE) 
# : arguments imply differing number of rows: 7, 2

 

 

 

(3) 동일 key 값 기준 결합 : merge(A, B, by='key)

 

두개의 데이터셋을 열 결합할 때 동일 key 값을 기준으로 결합을 해야 할 때가 있습니다.  cbind()의 경우 각 행의 관찰치가 서로 동일 대상일 때 그리고 갯수가 같을 때 가능하다고 했는데요, 만약 각 행의 관찰치가 서로 동일한 것도 있고 그렇지 않은 것도 섞여 있다면 그때는 cbind()를 사용하면 안됩니다.  이때는 동일 key 값을 기준으로 결합을 해주는 merge(A, B, by='key')를 사용해야만 합니다.

 

아래의 cbind()의 잘못된 예를 하나 보시겠습니다.

 

cust_mart_12  
# cust_id last_name 
# 1 c01 Kim 
# 2 c02 Lee 
# 3 c03 Choi 
# 4 c04 Park 
# 5 c05 Bae 
# 6 c06 Kim 
# 7 c07 Lim 


cust_mart_7 <- data.frame(
    cust_id = c("c03", "c04", "c05", "c06", "c07", "c08", "c09"), 
    buy_cnt = c(3, 1, 0, 7, 3, 4, 1))
    
cust_mart_7
# cust_id buy_cnt 
# 1 c03 3 
# 2 c04 1 
# 3 c05 0 
# 4 c06 7 
# 5 c07 3 
# 6 c08 4 
# 7 c09 1


cust_mart_127_cbind <- cbind(cust_mart_12, cust_mart_7)

cust_mart_127_cbind  
cust_id last_name cust_id buy_cnt 
# 1 c01 Kim c03 3 
# 2 c02 Lee c04 1 
# 3 c03 Choi c05 0 
# 4 c04 Park c06 7 
# 5 c05 Bae c07 3 
# 6 c06 Kim c08 4 
# 7 c07 Lim c09 1

 

 

cust_mart_12 와 cust_mart_7 의 두 개의 데이터 프레임의 관측치가 서로 같은 것(cust_id 가 c03 ~ c07)도 있는 반면, 서로 다른 것(cust_id 가 c01~c02, c08~c09)도 있습니다.  이런 데이터 셋을 cbind()로 결합시켜버리면 엉뚱한 데이터 셋이 생성되어 버립니다. Oh no~!!!!!

 

이런 경우에는 동일한 key 값을 기준으로 결합을 시켜주는 merge(A, B, by='key')가 답입니다.

SQL에 익숙한 분들은 잘 아시겠지만, merge에는 기준을 어느쪽에 두고 어디까지 포함하느냐에 따라 Inner Join, Outer Join, Left Outer Join, Right Outer Join 등의 4가지 종류가 있습니다.  이를 도식화하면 아래와 같습니다.

 

[ merge() 함수의 join 종류 ]

 

 

위에 제시한 4가지 join 유형별로 merge() 함수 사용예를 들어보겠습니다.

 

 

(3-1) merge() : Inner Join 

 

## -- (3-1) merge() : Inner Join

cust_mart_127_innerjoin <- merge(
    x = cust_mart_12, 
    y = cust_mart_7, 
    by = 'cust_id') 
    

cust_mart_127_innerjoin
# cust_id last_name buy_cnt 
# 1 c03 Choi 3 
# 2 c04 Park 1 
# 3 c05 Bae 0 
# 4 c06 Kim 7 
# 5 c07 Lim 3

 

 

(3-2) merge() - Outer Join

 

## -- (3-2) merge() : Outer Join

cust_mart_127_outerjoin <- merge(
    x = cust_mart_12, 
    y = cust_mart_7, 
    by = 'cust_id', 
    all = TRUE)
    
    
cust_mart_127_outerjoin
# cust_id last_name buy_cnt 
# 1 c01 Kim NA 
# 2 c02 Lee NA 
# 3 c03 Choi 3 
# 4 c04 Park 1 
# 5 c05 Bae 0 
# 6 c06 Kim 7 
# 7 c07 Lim 3 
# 8 c08 <NA> 4 
# 9 c09 <NA> 1

 

 

 

(3-3) merge() : Left Outer Join

 

## -- (3-3) merge() : Left Outer Join 

cust_mart_127_leftouter <- merge(
    x = cust_mart_12, 
    y = cust_mart_7, 
    by = 'cust_id', 
    all.x = TRUE)
    
    
cust_mart_127_leftouter  
# cust_id last_name buy_cnt 
# 1 c01 Kim NA 
# 2 c02 Lee NA 
# 3 c03 Choi 3 
# 4 c04 Park 1 
# 5 c05 Bae 0 
# 6 c06 Kim 7 
# 7 c07 Lim 3 

 

 

(3-4) merge() : Right Outer Join

 

## -- (3-4) merge : Right Outer Join 

cust_mart_127_rightouter <- merge(
    x = cust_mart_12, 
    y = cust_mart_7, 
    by = 'cust_id', 
    all.y = TRUE)
    

cust_mart_127_rightouter
# cust_id last_name buy_cnt 
# 1 c03 Choi 3 
# 2 c04 Park 1 
# 3 c05 Bae 0 
# 4 c06 Kim 7 
# 5 c07 Lim 3 
# 6 c08 <NA> 4 
# 7 c09 <NA> 1 

 

 

이상 merge() 함수의 4가지 유형의 join 에 대하여 알아보았습니다.  마지막으로, merge() 함수는 2개의 데이터 셋의 결합만 가능하며, 3개 이상의 데이터 셋에 대해서 key 값 기준 merge() 결합을 하려고 하면 에러가 나는 점 유의하시기 바랍니다.

 

## -- error

merge(cust_mart_12, cust_mart_5, cust_mart_7, by = 'cust_id') 
# Error in fix.by(by.x, x) 
# : 'by' must specify one or more columns as numbers, names or logical

 

따라서 데이터 프레임 2개씩을 key 값 기준으로 순차적으로 merge() 해나가야 합니다.

 

dplyr 패키지의 Mutating Joins (inner, left, right, full), Filtering Joins (semi, anti), Nesting Joins(nest) 방법은 rfriend.tistory.com/625 를 참고하세요. 

 

이상으로 데이터 프레임의 결합에 대해서 마치도록 하겠습니다. 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

반응형
Posted by Rfriend

댓글을 달아 주세요

  1. AshtrayK 2016.09.02 14:14 신고  댓글주소  수정/삭제  댓글쓰기

    이번은 질문도 없네요 ㅎㅎㅎ
    감사합니다!

  2. 익명 2016.09.22 16:08  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 제발 2016.09.28 20:16  댓글주소  수정/삭제  댓글쓰기

    혹시 개인적으로 궁금한거 여쭤봐도될까요 ㅠㅠ

  4. 산낙지 2016.10.21 10:09  댓글주소  수정/삭제  댓글쓰기

    merge에 대해 이해가 너무 잘 되네요!
    좋은 설명 너무 감사합니다 ^^
    정말 구글에서는 영어로만 나와서 아무래도 찾기 막막했는데
    r friend님 블로그에 정리가 너무 잘 되어 있어서 항상 도움 받네요 ^^

  5. 바람 2017.05.31 15:23  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 merge와 join에 대하여 이해를 잘 했는데 혹시 데이터id 가 중복이 됐는데 다른 변수들 값이 다른 경우에 병합은 merge로 못하나요??

    • Rfriend 2017.05.31 15:27 신고  댓글주소  수정/삭제

      그런 경우라면 merge 시 뻥튀기가 될겁니다. id 외 추가로 key 값으로 쓸 수 있는게 있으면 paste로 id와 다른 변수를 합쳐서 새로운 key 변수 만든후에 merge하면 되구요.

  6. 익명 2017.06.03 15:35  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  7. 너무 좋아요! 2018.08.27 18:03  댓글주소  수정/삭제  댓글쓰기

    잘 보고 있어요 너무 감사합니다. ㅎ

  8. 익명 2018.12.02 16:10  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Rfriend 2018.12.02 17:00 신고  댓글주소  수정/삭제

      분석 목적이 무엇인가, 분석기법이 무엇인가에 따라 자료 구조가 달라집니다. 분석 목적과 기법에 맞는 예제 자료 형태와 코드를 미리 살펴보시는게 좋겠습니다.

      melt, cast 함수를 사용하면 자료 구조를 원하는 형태로 바꾸실 수 있습니다.

  9. redsky 2019.10.31 16:53  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 항상 님 블로그에서 많은 도움을 받고 있습니다. 이번에 데이터를 정리하면서 엑셀 vlookup의 유사일치 기능 처럼 값이 완전히 일치하지 않고 유사한 경우에도 매칭을 시키고 싶은데 혹시 R의 merge 함수 에서도 이런게 가능한지 궁금합니다. 아니면 혹시 다른 함수로 구현이 가능하다면 좀 알려주시면 감사하겠습니다.

    • Rfriend 2019.10.31 17:47 신고  댓글주소  수정/삭제

      안녕하세요 redsky님.
      질믄하신 부분은 저도 해본적이 없어서 잘 모르겠네요. merge() 에서 바로 말고 다른 함수(regular expression??)에서 처리 후 merge 함수 사용해보는 방법도 있을거 같습니다.

    • Rfriend 2019.10.31 20:14 신고  댓글주소  수정/삭제

      간단한 예제 샘플 데이터와 로직, 그리고 아웃풋 이미지 남겨주시면 한번 살펴볼께요.

    • redsky 2019.11.04 11:29  댓글주소  수정/삭제

      아 감사합니다. 샘플 예제는 아래와 같습니다.
      1. 기준유량 : 10, 20, 30, 40, 50
      2. 기준유량 별 초과확률 : 90%, 80%, 70%, 60%, 50%
      3. 실측유량 : 19.8, 10.5, 50.5, 30.6, 39.1

      정해진 기준유량(1)과 각 기준유량별 초과확률(2) 데이터가 있고

      이때 실측유량(3) 값을 가장 근접한 기준유량(1) 값과 매칭하여

      해당 기준유량과 연결된 초과확률(2)을 구하려고 합니다.

      위 예시로 제가 원하는 결과 데이터는 80%, 90%, 50%, 70%, 60% 입니다.

      이게 엑셀에서는 vlookup으로 마지막 인수를 TRUE로 작성하면 비슷하게 일치하는

      데이터를 찾아줘서 쉽게 해결이 가능하긴 한데 워낙 데이터가 많아서

      R로 해볼려고 했더니 막상 이런 기능을 하는 함수를 모르겠네요;;

    • Rfriend 2019.11.04 11:54 신고  댓글주소  수정/삭제

      안녕하세요 redsky님,

      아래에 실제유량과 기준유량간의 거리(distance)를 구해서 최소거리 위치(index)의 초과확률을 가져오는(indexing) 코드를 짜보았습니다. 도움이 되었기를 바랍니다.

      # input data
      ref_flow <- c(10, 20, 30 40, 50)
      ref_excess_prob <- c(90, 80, 70, 60, 50)
      real_flow <- c(19.8, 10.5, 50.5, 30.6, 39.1)

      # blank vector to store the result
      real_excess_prob <- c()

      # for loop to get the most similar ref_flow and ref_excess_prob using distance

      for (i in 1:length(real_flow)){
      gap_abs <- abs(ref_flow - real_flow[i])
      min_idx <- which.min(gap_abs)
      real_excess_prob[i] <- ref_excess_prob[min_idx]
      }

      # print the result
      real_excess_prob
      [1] 80 90 50 70 60

    • redsky 2019.11.04 13:41  댓글주소  수정/삭제

      알려주신 방법으로 해봐야 겠네요.
      답변 정말 감사합니다~

    • Rfriend 2019.11.04 15:02 신고  댓글주소  수정/삭제

      도움이 되었기를 바래요. :-)

  10. 소쿠리 2020.03.05 00:55  댓글주소  수정/삭제  댓글쓰기

    설명이 꼼꼼하여 쉽게 이해가 되네요.
    감사합니다.

  11. 감사합니다. 2020.12.30 14:41  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    R을 혼자서 공부하며 선생님의 블로그 덕분에 정말 많은 도움이 되고 있습니다.
    좋은 지식을 함께 나누어 주셔서 항상 감사 드립니다.
    code를 집에서 홀로 공부하다 막히는 부분이 있어서 몇 가지만 문의 드리고자 댓글을 남깁니다.
    연말에 바쁘실텐데 귀찮게 해드리는건 아닌지 모르겠습니다.

    1) df의 특정 Test_HR 컬럼이 만약 chr type이고 이것들의 값은 다음과 같았을때,
    $ Test_HR <chr> "0500", "0900", "1300", "1700", "2100", "0100", ...
    $ Test_DDHR <dttm> 2020-12-01 05:00:00, 2020-12-01 09:00:00, ...
    Test_HR 컬럼의 값이 "0100"일 경우에 해당 행의 Test_DDHR 컬럼의 날짜시간
    데이터값을 [기존값+ 1일(day)]이 되도록 모두 처리하고 싶습니다.
    제가 ifelse, while문으로 해보려고 했는데 아직 초보자인 제게는 쉽지가 않네요.
    조언을 부탁드리겠습니다.

    2) 두 개의 df이 있고 각 df 마다 Test_DDHR <dttm> 컬럼과 같은 날짜시간 데이터값을
    가지는 특정 컬럼이 있을 경우, 이 시간값을 키값으로 하여 두 개의 df를 하나의
    df로 merge하고 싶습니다.
    [df#1] $ Test_DDHR <dttm> 2020-12-01 05:00:00, 2020-12-01 09:00:00, ...
    [df#2] $ Test_DDHR <dttm> 2020-12-01 05:11:28, 2020-12-01 10:34:46, ...
    그런데,, 위의 예시에서도 알 수 있듯이 두 개의 df에 있는 날짜시간 데이터 값들이
    서로 정확히 일치하지 않기 때문에 이럴 경우에는 어떻게 이 시간값을 기준으로
    병합할 수 있는지 문의 드립니다.
    저는 예전에 엑셀에서 vlookup 함수를 사용하여 유사일치(TRUE) 조건을 넣어서 병합
    했었는데, R에서는 code로 어떻게 처리해야 할까요?
    데이터 보간을 해야 하는건지,, 엑셀에서 했던것 처럼 가장 가까운 시간대 값을
    가져오게 해야 하는건지.. 너무도 궁금합니다.

    제가 드리고 싶은 질문이 선생님께 잘 설명이 되었는지 모르겠습니다.
    새벽에 혼자서 책보고, 구글링하며 연습하다가 여기서 막혔는데 궁금해 죽겠습니다.ㅎㅎ
    바쁘시겠지만 지도를 좀 부탁드리겠습니다.
    새해 복 많이 받으시고, 앞으로도 선생님의 좋은 블로그를 통해 많이 배워 선생님처럼
    지식을 남들과 나눌수 있기를 바래봅니다.
    감사합니다.

    • Rfriend 2020.12.30 16:57 신고  댓글주소  수정/삭제

      안녕하세요.
      블로그 좋게 봐주셔서 감사합니다.

      (1) 번 질문에 대해서는 아래 코드 참고하세요. lubridate 패키지로 날짜시간 포맷 설정해주고, ifelse 조건문으로 짜보았습니다.

      library(dplyr)
      library(lubridate)

      test_hr <- c("0500", "0900", "1300", "1700", "2100", "0100")
      test_ddhr <- c("2020-12-01 05:00:00", "2020-12-01 12:00:00", "2020-12-01 07:00:00",
      "2020-12-01 08:00:00", "2020-12-01 04:00:00", "2020-12-01 19:00:00")

      df <- data.frame(test_hr, test_ddhr)
      df <- df %>%
      mutate(test_ddhr = ymd_hms(test_ddhr))


      df <- df %>%
      mutate(test_ddhr2 = ifelse(test_hr == "0100",
      as.character(test_ddhr + days(1)),
      as.character(test_ddhr)),
      test_ddhr2 = ymd_hms(test_ddhr2))

      df
      # test_hr test_ddhr test_ddhr2
      # 1 0500 2020-12-01 05:00:00 2020-12-01 05:00:00
      # 2 0900 2020-12-01 12:00:00 2020-12-01 12:00:00
      # 3 1300 2020-12-01 07:00:00 2020-12-01 07:00:00
      # 4 1700 2020-12-01 08:00:00 2020-12-01 08:00:00
      # 5 2100 2020-12-01 04:00:00 2020-12-01 04:00:00
      # 6 0100 2020-12-01 19:00:00 2020-12-02 19:00:00 <-- ** 잘 변경됨 **


      (2)번 질문은 시계열데이터 분석에 관한 것인지요? 만약 시계열데이터 분석을 위한 것이라면 '분석 목적'과 '보유 데이터 형태'에 맞게 '분석의 단위 (예: day, hour, 10 minutes, 1 minute, 1 second, 1 milisecond 등)' 에 맞게 '기준 timestamp_dim_table' 을 만들어놓고 시작합니다. (DB라면 기준 table이 되겠구요, R이나 Python이라면 data.frame 이 되겠습니다.)

      그리고 여기에 '분석단위'를 기준으로 '기준 timestamp_dim_table'에 merge (DB라면 join)을 해줍니다. (가령, 데이터셋은 년/월/일/시/분/초 단위인데, 분석 기준 단위는 '일' 단위라면 원래 데이터셋을 '일'단위로 집계한 후에, 이것을 '기준 timestamp_dim_table 에 merge (or join) 해줍니다. 만약 해당 일에 데이터가 없다면 merge 된 후의 값은 NA로 되어있을 텐데요, 이것은 보간이나 결측값 채우기해줍니다.)

      Python과 PostgreSQL DB의 경우아래 포스팅 참고하세요. (R은 아직 시계열데이터 분석 포스팅을 못하고 있습니다.)

      [Python] https://rfriend.tistory.com/501
      [PostgreSQL] https://rfriend.tistory.com/495

      위의 방식대로 일정 주기(frequency, period)의 시계열 데이터로 취합, 집계 한후에 결측값 처리 (보간)을 해주고, 이후 시계열 분석 진행하시면 됩니다.

  12. gogo 2021.08.23 17:55  댓글주소  수정/삭제  댓글쓰기

    안녕하세요!
    저도 데이터 병합을 하려고 하다 자꾸 막혀서 여기까지 오게 되었어요 ㅠㅠ
    제가 데이터 2개를 합치려고 하는데, 열과 행이 모두 다른 데이터예요. 행은 국가, 열은 투표 여부, 소득수준 등이 있는 데이터들인데요, 각 데이터에서 없는 것을 보완하려고 합치는데, 투표 여부, 소득수준 등은 이미 겹치는 변수들이에요. 문제는,
    1. 데이터1, 2의 나라가 겹치는 경우도 있고, 없는 나라도 있는데 그동안은 by "country"로 해서, 없는 나라의 경우에는 merge가 안 된 게 아닌가 생각이 듭니다. 이 경우는 행이 다른 경우이고요,
    2. 나라는 두 데이터 모두에 있지만, 저 겹치는 변수들 (ex. 투표여부)이 다르게 코딩이 돼 있습니다. 데이터 1은 dummy로 돼 있고 data2는 연속형으로 돼 있어서 (투표를 했다, 할 것이다, 안 했다, 1-3 이런 식으로) 이렇게 된 데이터는 merge가 가능한가요?
    그래서 저는 data2의 저 변수들을 dummy로 바꾸고서 합치려고 했는데요,
    1번 문제도 있어서, 이렇게 행, 열에서 common 인 것이 없는 경우에는 어떻게 해야하는지 알고 싶습니다.

    도움주셔서 정말정말 감사드립니다 ㅠㅠ

    • Rfriend 2021.08.24 15:03 신고  댓글주소  수정/삭제

      안녕하세요 gogo님.

      1. 투표 여부가 양쪽 데이터셋에 모두 있는데 형태가 다르다고 하셨는데요, 일단 칼럼 이름을 서로다르게 해서 merge를 하세요.

      2. merge(x=data1, y=data2, by='country', all=TRUE) 로 해서 full outer join을 하세요. 이러면 한쪽 데이터셋에만 존재하는 데이터도 유실되는거 없이 모두 country를 기준으로 merge 가 되고, 한쪽에는 없는 칼럼 값의 경우 결측값이 됩니다.

      3. 다시 1번 문제로 돌아가서요, '투표여부'가 칼럼 이름이 다른 채로 2개가 있는데요, ifelse() 조건문으로 해서 새로운 최종 '투표여부' 칼럼을 추가로 만들어주세요.

  13. gogo 2021.08.24 21:59  댓글주소  수정/삭제  댓글쓰기

    오 이렇게 자세하게 알려주셔서 정말 감사드려요 ㅠㅠ
    1, 3번은 이해가 됐는데,
    제가 설명을 좀 애매한 것 같은게, country도 data1, data2가 달라요. data1에 없는 나라가 data2에는 있고, 반대도 마찬가지구요. 이러면 by "country"로 하면 데이터가 유실되지 않나요? 예를 들면 data1 기준으로 merge 하면 data1에 없는 data2의 나라들이 유실되는 건 아닌가 해서요. 그래서 뭘 기준으로 merge를 해야할지 모르겠더라구요. 이렇게 공통되는 부분이 하나도 없으면 merge 자체가 불가능한가요?

    다시 한 번 정말 감사드립니다 ㅠㅠ

    • Rfriend 2021.08.24 23:14 신고  댓글주소  수정/삭제

      안녕하세요.

      포스팅 본문에 보면 merge 에도 full join (all=TRUE 옵션 적용), left join, right join, inner join 등 여러 가지가 있습니다. 그중에서 gogo 님께서는 한쪽에만 있더라도 모두 값을 유지하는 합집합 개념의 merge를 원하시는 것 같아서 full join 을 해보라고 말씀드렸던 것입니다.

      한번 merge() 의 세부 옵션을 달리 해보면서 다양한 join 별로 값이 어떻게 달라지는지 관찰해보시면 금방 이해가 되실거 같아요.

  14. gogo 2021.08.24 23:22  댓글주소  수정/삭제  댓글쓰기

    아, 제 이해가 부족했었군요!
    네, 다시 시도해봐야겠습니다.

    많은 도움 주셔서 정말 감사합니다 :)

  15. 김현호 2021.09.03 16:25  댓글주소  수정/삭제  댓글쓰기

    질문남깁니다. R로 전처리 하는 중인데 날짜별로 전종목의 주가 시트를 한 장 씩 받아서 그걸 날짜별로 시총과 종가를 나타내야합니다.

    우선merge를 활용하여 FUll JOin으로 기업코드를 기준으로 상폐종목이나 새로 상장된 종목을 반영하였습니다.

    이후 ggplot을 활용하여 시각화를 하려고 하는데 그러기 위해선 현재 예컨데 주가변수가 한 줄에 9/1일 주가 9/2일 주가 두 개가 존재해서 안되고 9/1일과 9/2일의 내용을 한줄한줄씩 합쳐야 합니다. 어떻게 하면 될까요?

    • Rfriend 2021.09.03 16:29 신고  댓글주소  수정/삭제

      안녕하세요.
      간단하게 인풋, 아웃풋 데이터 예제를 남겨주시면 제가 정확하게 이해하는데 도움에 되겠습니다.

  16. 이승현 2021.11.05 17:10  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 궁금한게 있습니다.

    merge시 key변수가 데이터프레임의 맨앞으로 위치하는데 원래 그자리에 위치하는 것은 따로 옵션이 있나요?

    • Rfriend 2021.11.05 17:36 신고  댓글주소  수정/삭제

      안녕하세요, 이승현님.

      merge 시 key 변수가 데이터프레임의 맨앞이 아니어도 상관없습니다.

      포스팅 본문에서는 간단한 예제를 만들다보니 편의상 key 값을 데이터프레임의 맨 앞에 만들었는데요, merge 의 기준이 되는 key 변수는 데이터프레임의 어느 위치에 있으나 잘 작동합니다.