워라밸 중독자

[R] 데이터 전처리 - 결합 (cbind, rbind, merge) 본문

코딩, 딱 지금이 시작할때! (코딱지)

[R] 데이터 전처리 - 결합 (cbind, rbind, merge)

Ufungi 2023. 1. 7. 01:35

cbind(), rbind(), merge() 함수

 

cbind()

두 개 이상의 벡터/행렬/데이터프레임을 열(column) 방향으로 결합. 행의 이름과 개수가 같아야함.

# 벡터와 벡터의 열방향 결합 => 행렬 (matrix)
> x1 <- c(1,2,3,4) # 벡터
> x2 <- c("a","b","c","d") # 벡터
> x3 <- c(T,F,F,F) # 벡터
> x <- cbind(x1,x2,x3)
> x
     x1  x2  x3     
[1,] "1" "a" "TRUE" 
[2,] "2" "b" "FALSE"
[3,] "3" "c" "FALSE"
[4,] "4" "d" "FALSE"
> class(x)
[1] "matrix" "array" 

# 데이터프레임과 벡터의 열방향 결합
> df1 <- data.frame(x1,x2,x3) # 데이터프레임
> y1 <- c(5,6,7,8) # 벡터
> cbind(df1,y1)
  x1 x2    x3 y1
1  1  a  TRUE  5
2  2  b FALSE  6
3  3  c FALSE  7
4  4  d FALSE  8

# 데이터프레임과 데이터프레임의 열방향 결합
> y2 <- c("a","b","e","f") 
> y3 <- c(F,T,T,F)
> df2 <- data.frame(y1,y2,y3) # 데이터프레임
> cbind(df1,df2)
  x1 x2    x3 y1 y2    y3
1  1  a  TRUE  5  a FALSE
2  2  b FALSE  6  b  TRUE
3  3  c FALSE  7  e  TRUE
4  4  d FALSE  8  f FALSE

*위 예시에서는 행 이름을 지정하지 않았기 때문에 이름과 상관 없이 잘 결합됨.

 

rbind()

두 개 이상의 벡터/행렬/데이터프레임을 행(row) 방향으로 결합. 열의 이름과 개수가 같아야함.

# 열 이름이 같은지 확인
> colnames(df1)
[1] "x1" "x2" "x3"
> colnames(df2)
[1] "y1" "y2" "y3"
> rbind(df1,df2)

# 열 이름이 일치하지 않는 경우 => Error 발생
> rbind(df1,df2)
Error in match.names(clabs, names(xi)) : 
  이전에 사용된 이름들과 일치하지 않습니다.
  
# 열 이름이 일치하는 경우
> rbind(df1,df1)
  x1 x2    x3
1  1  a  TRUE
2  2  b FALSE
3  3  c FALSE
4  4  d FALSE
5  1  a  TRUE
6  2  b FALSE
7  3  c FALSE
8  4  d FALSE

 

merge()

merge 함수는 두 개의 데이터프레임을 공통된 열의 행 값(key)을 기준으로 결합 (두 개 이상의 데이터셋에서는 사용 불가).

매개변수에 따라 inner join, outer join, left join, right join 으로 다양하게 활용할 수 있다.

#앞의 df1, df2 에 key로 쓰일 열 지정
> df1 <- cbind(df1, "key.col"=c("A","B","C","D"))
> df2 <- cbind(df2, "key.col"=c("A","B","E","F"))
> df1
  x1 x2    x3 key.col
1  1  a  TRUE       A
2  2  b FALSE       B
3  3  c FALSE       C
4  4  d FALSE       D
> df2
  y1 y2    y3 key.col
1  5  e FALSE       A
2  6  f  TRUE       B
3  7  g  TRUE       E
4  8  h FALSE       F

## df1과 df2의 공통된 열인 key.col 열의 값을 기준으로 병합
# inner join: 두 데이터프레임의 key를 기준으로 교집합
> merge(df1, df2, by = "key.col")
  key.col x1 x2    x3 y1 y2    y3
1       A  1  a  TRUE  5  e FALSE
2       B  2  b FALSE  6  f  TRUE

# outer join: 두 데이터프레임의 key를 기준으로 합집합
> merge(df1, df2, by = "key.col", all = T)
  key.col x1   x2    x3 y1   y2    y3
1       A  1    a  TRUE  5    e FALSE
2       B  2    b FALSE  6    f  TRUE
3       C  3    c FALSE NA <NA>    NA
4       D  4    d FALSE NA <NA>    NA
5       E NA <NA>    NA  7    g  TRUE
6       F NA <NA>    NA  8    h FALSE

# left join: 왼쪽(x) 데이터프레임의 key를 기준으로 병합
> merge(df1, df2, by = "key.col", all.x = T)
  key.col x1 x2    x3 y1   y2    y3
1       A  1  a  TRUE  5    e FALSE
2       B  2  b FALSE  6    f  TRUE
3       C  3  c FALSE NA <NA>    NA
4       D  4  d FALSE NA <NA>    NA

# right join: 오른쪽(y) 데이터프레임의 key를 기준으로 병합
> merge(df1, df2, by = "key.col", all.y = T)
  key.col x1   x2    x3 y1 y2    y3
1       A  1    a  TRUE  5  e FALSE
2       B  2    b FALSE  6  f  TRUE
3       E NA <NA>    NA  7  g  TRUE
4       F NA <NA>    NA  8  h FALSE