[R] 데이터 결합하기
- R
- 2022. 5. 13.
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처리후 병합
- - TRUE : 공통 행만 병합
- 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' 카테고리의 다른 글
[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 |