본문 바로가기

데이터분석/R

[R 프로그래밍] 데이터 가공 - 데이터 합치기 : left_join(), bind_rows() (dplyr)

#dplyr 패키지의 left_join() 및 bind_rows()를 사용해서 열 및 행 합치기

library(dplyr)


#특정 컬럼을 기준으로 열 합치기


#left_join()을 사용해서 class컬럼을 기준으로 데이터 합치기

#아래 테이블을 class를 기준으로 합쳐보자

> math_test_total

  class midterm final

1     1      88    78

2     2      75    85

3     3      78    68

4     4      77    79

5     5      96    86

> class_name
  class   name
1     1 햇님반
2     2 달님반
3     3 별님반
4     4 꽃님반

5     5 풀님반 


#left_join(테이블A, 테이블B, by="기준으로 삼을 컬럼 명")
#math_test_total 테이블과 class_name을 class기준으로 합치려면 다음과 같이 입력한다.
math_test <- left_join (math_test_total,class_name,by="class")

> math_test

  class midterm final   name
1     1      88    78 햇님반
2     2      75    85 달님반
3     3      78    68 별님반
4     4      77    79 꽃님반
5     5      96    86 풀님반



#만약 기준 컬럼이 아닌데, 컬럼 명이 같을 경우 다음과 같이 표시된다.
#컬럼 이름이 변경됨. by로 설정한 기준 컬럼만 동일한 데이터로 취급한다.

> #반별 중간고사 수학 평균 점수

> math_test_midterm <- data.frame (class = c(1,2,3,4,5),

+                   midterm = c(88, 75, 78, 77, 96))

> #반별 기말고사 수학 평균 점수

> math_test_final <- data.frame (class = c(1,2,3,4,5),

+                                  midterm = c(78, 85, 68, 79, 86))


> #left_join()을 사용해서 class컬럼을 기준으로 데이터 합치기

> math_test_total <- left_join(math_test_midterm,math_test_final,by="class")

> math_test_total

  class midterm.x midterm.y

1     1        88        78

2     2        75        85

3     3        78        68

4     4        77        79

5     5        96        86 




#dplyr 패키지의 bind_rows()함수를 통해 열 합치기

#bind_rows(테이블A, 테이블 B) 를 입력해서 열을 추가할 수 있다.


#dplyr의 bind_rows()를 이용해 데이터 세로로 합치기

#데이터 세로로 합치기

#1~2반의 시험 데이터

test1 <- data.frame (class = c (1,2),

                       test = c(60,80))

> test1

  class test

1     1   60

2     2   80

 

#3~5반의 시험데이터

test2 <- data.frame (class = c(3,4,5),

                       test = c(95,80,20))

> test2

  class test

1     3   95

2     4   80

3     5   20 


#bind_rows()를 이용해 데이터 세로로 합치기

test_all <- bind_rows(test1,test2)

#자동으로 동일한 컬럼 name끼리 합쳐진다. 

 class test

1     1   60

2     2   80

3     3   95

4     4   80

5     5   20 


#만약 컬럼 이름이 다를 경우에는 다음과 같이 된다.

#class와 test가 아니라 id와 midterm을 가지는 테이블 추가
test3 <- data.frame (id = c(6,7),

                       midterm = c(30,40)) 

> test3

  id midterm

1  6      30

2  7      40


#위의 세개 테이블을 합치면 같은 컬럼끼리만 합치고, 값이 없는 컬럼은 NA로 표시된다.

test_all2 <- bind_rows(test1,test2, test3)

>test_all2

  class test id midterm

1     1   60 NA      NA

2     2   80 NA      NA

3     3   95 NA      NA

4     4   80 NA      NA

5     5   20 NA      NA

6    NA   NA  6      30

7    NA   NA  7      40 


#컬럼 이름이 다를 경우 이름을 바꿔서 합치자.

#컬럼 이름 변경은 아래 링크 참고

http://realab.tistory.com/8