[R] 데이터 결합하기

반응형
    반응형

    R에서의 데이터 결합 방법입니다.
    데이터 결합을 하기 위해서는 rbind,cbind,merge 함수를 사용합니다. 벡터, 행렬, 데이터 프레임 모두 가능하고 간편하게 결합이 가능합니다.

    rbind는 행 결합, cbind는 열결합, merge는 key에 의해 결합됩니다.

     

    rbind

    rbind는 다른 파라미터는 없고 데이터만 넣어주면 됩니다.
    백터나 행렬은 단일 데이터 타입만을 가지고 가므로 결합할 때 그 부분을 주의해줍니다. 다중 데이터 타입을 결합하더라도 안 되지는 않고 우선순위(문자열>숫자>논리)에 따라 결정됩니다.

    #vector
    > v1 = c(1,2,3)
    > v2 = c('a','b','c')
    > rbind(v1,v2)
       [,1] [,2] [,3]
    v1 "1"  "2"  "3" 
    v2 "a"  "b"  "c" 

     

    행렬은 다른 모양이면 결합이 불가능합니다.

    #matrix 모양이 같은 경우
    > m1 = matrix(1:12,nrow=4)
    > m2 = matrix(13:24,nrow=4)
         [,1] [,2] [,3]
    [1,]    1    5    9
    [2,]    2    6   10
    [3,]    3    7   11
    [4,]    4    8   12
    [5,]   13   17   21
    [6,]   14   18   22
    [7,]   15   19   23
    [8,]   16   20   24
    
    #matrix 모양이 다른 경우
    > m3 = matrix(1:12,ncol=4)
    > rbind(m1,m3)
    Error in rbind(m1, m3) : 
      number of columns of matrices must match (see arg 2)

    벡터와 행렬의 결합도 가능합니다.

    > rbind(v1,m1)
       [,1] [,2] [,3]
    v1    1    2    3
          1    5    9
          2    6   10
          3    7   11
          4    8   12

    데이터 프레임은 데이터프레임끼리만 결합이 가능하고 모양이 다르면 불가능합니다. 하지만, 데이터 타입이 달라도 괜찮습니다.

    > df1 = data.frame(m1)
    > df2 = data.frame(m2)
    
    > rbind(df1,df2)
      X1 X2 X3
    1  1  5  9
    2  2  6 10
    3  3  7 11
    4  4  8 12
    5 13 17 21
    6 14 18 22
    7 15 19 23
    8 16 20 24
    
    # 데이터 타입이 다를 때
    > v1 = t(c('a','b','c'))
    > df = data.frame(v1)
    > df1 = data.frame(m1)
    > rbind=(df,df1)
      X1 X2 X3
    1  a  b  c
    2  1  5  9
    3  2  6 10
    4  3  7 11
    5  4  8 12

    cbind

    cbind도 rbind와 같은 방식이고 열결합으로 이루어집니다.

    > cbind(v1,v2)
         v1  v2 
    [1,] "1" "a"
    [2,] "2" "b"
    [3,] "3" "c"
    > cbind(m1,m2)
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1    5    9   13   17   21
    [2,]    2    6   10   14   18   22
    [3,]    3    7   11   15   19   23
    [4,]    4    8   12   16   20   24
    
    > cbind(df1,df2)
      X1 X2 X3 X1 X2 X3
    1  1  5  9 13 17 21
    2  2  6 10 14 18 22
    3  3  7 11 15 19 23
    4  4  8 12 16 20 24

    merge

    merge는 두 데이터 프레임이 공통된 열을 하나 이상 가지고 있는 경우 기준이 되는 컬럼의 값이 같은 행끼리 묶어주는 함수입니다.

    파라미터는 다음과 같습니다.
    merge(x,y,by,by.x,by.y,all=FALSE,all.x,all.y)

    • x, y : 병합할 데이터 프레임
    • by : 병할할 기준 컬럼
    • by.x,by.y : 컬럼의 이름이 다른 경우 기준 컬럼을 각각 지정
    • all : 공통값이 한 쪽에 없는 경우 처리(디폴트 FALSE)
      •   - TRUE : 공통 행만 병합
          - FALSE : 공통값이 없는 경우 NA처리후 병합
    • all.x,all.y : TRUE일 경우 해당 데이터는 공통값이 없어도 모든 값 포함
      •   all.x=TRUE : x데이터의 모든 행 포함, all.y=TRUE : y데이터의 모든 행 포함

     

    어떤 컬럼을 기준으로 병합할지를 by 파라미터로 지정해주어야 합니다. 컬럼의 값이 공통이 있음에도 이름이 다를 경우는 by.x,by.y로 이름을 각각 지정해주어야 합니다.

    컬럼이름이 같은경우

    컬럼이름을 name으로 같게 하고 공통된 값은 2개인 경우입니다.

    > df = data.frame(name=c('Henry','Max','Rex'),math=c(100,70,30))
    > df1 = data.frame(name=c('Max','Rex','Joshua'),english=c(100,70,80))
    > merge(df,df1)
      name math english
    1  Max   70     100
    2  Rex   30      70
    
    # df 값 모두 반영
    > merge(df,df1,all.x=T)
       name math english
    1 Henry  100      NA
    2   Max   70     100
    3   Rex   30      70
    
    # df, df1 값 모두 반영
    > merge(df,df1,all=T)
        name math english
    1  Henry  100      NA
    2 Joshua   NA      80
    3    Max   70     100
    4    Rex   30      70
    
    

    보시는 바와 같이 all=T 여부에 따라 선택되는 데이터가 달라집니다.

    컬럼이름이 다른 경우

    df의 name을 student로 바꾸어 컬럼을 다르게 한 후 merge를 진행하겠습니다.

    > df = data.frame(student=c('Henry','Max','Rex'),math=c(100,70,30))
    > df1 = data.frame(name=c('Max','Rex','Joshua'),english=c(100,70,80))
    
    > merge(df,df1)
      student math   name english
    1   Henry  100    Max     100
    2     Max   70    Max     100
    3     Rex   30    Max     100
    4   Henry  100    Rex      70
    5     Max   70    Rex      70
    6     Rex   30    Rex      70
    7   Henry  100 Joshua      80
    8     Max   70 Joshua      80
    9     Rex   30 Joshua      80

    공통된 컬럼을 알 수 없을때, 컬럼의 지정 없이 merge를 진행하면 보시는 바처럼 전부를 몽땅 merge를 해버립니다.

    따라서, 명확한 지정이 없을시에는 데이터 정제가 아닌 단순 합치기가 되어버립니다.

     

    컬럼의 이름이 다르니 각 컬럼을 지정하겠습니다.

    > merge(df,df1,by.x='student',by.y='name')
      student math english
    1     Max   70     100
    2     Rex   30      70
    

    잘 나오는 것을 볼 수 있습니다.

     

     

    관련 포스팅

    [R] 행렬(matrix) 다루기

    [R] 데이터 프레임 다루기

    [R] 벡터 다루기(내장함수와 연산)

    [R] 벡터 다루기(입출력)

    'R' 카테고리의 다른 글

    [R] 반복문(for,while,repeat)  (0) 2022.05.19
    [R] 조건문 만들기(if, ifelse,switch)  (0) 2022.05.18
    [R] 데이터 프레임 다루기  (0) 2022.05.06
    [R] 행렬(matrix) 다루기  (0) 2022.05.05
    [R] 리스트(list)  (0) 2022.05.03

    댓글

    Designed by JB FACTORY

    ....