[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