본문 바로가기

R데이터전처리

[R-전처리] 데이터 테이블 조인(dplyr join)

실전 업무에서 데이터베이스는 데이터 종류별로 테이블이 나뉘기 때문에 하나의 테이블에 필요한 데이터 모두 포함된 경우는 드물다.

 

이상적인 분석용 데이터를 만들기 위해서는 데이터 테이블을 결합하는 처리가 필요하다.

 

 

 

< 실습용 예제 데이터 생성 >

학생테이블, 수업테이블 그리고 수강 신청 테이블을 각각 생성한다.

 

# 학생테이블
students <- data.frame(studentID = c(2019100, 2019101, 2018102, 2018103,
                                     2015104, 2015105, 2019106, 2020107,
                                     2020108, 2018109),
                       names = c("정해인", "채수빈", "이하나", "김성규", 
                                 "이상희", "이정은", "이승준", "강봉성", 
                                 "김정우", "우지현"),
                       major = c("경영학과", "통계학과", "통계학과", "사회학과", 
                                 "경영학과", "경영학과", "경제학과", "사회학과",
                                 "경제학과", "통계학과"))

# 수업테이블
lecture <- data.frame(lec_cd = c("D1000", "S1001", "B1002", "D1003", "D1004"),
                      nm = c("데이터마이닝", "확률과통계", "마케팅",
                             "데이터분석프로그래밍", "데이터베이스"),
                      professor = c("한지원", "임태경", "임태경", 
                                    "곽기석", "한지원"))


# 수강신청테이블
lec_stu <- data.frame(lec_cd = c("D1000", "D1000", "D1000", "D1000", "D1000", 
                             "S1001", "S1001", "S1001", "S1001", 
                             "B1002", "B1002", "B1002", "B1002", "B1002", 
                             "D1003", "D1003", "D1003", "D1003", "D1003", "D1003", "D1003", "D1003", 
                             "D1004", "D1004", "D1004", "D1004", "D1004"),
                      studentID = c(2019100, 2015104, 2015105, 2019106, 2018109,
                             2019101, 2018102, 2018103, 2020107,
                             2015104, 2015105, 2019106, 2018109, 2020108,
                             2019100, 2019101, 2018102, 2015104, 2015105, 2019106, 2020108, 2018109, 
                             2019109, 2019101, 2018102, 2015105, 2015104))

 

학생테이블에는 studentID가 있고 학생이름, 전공 정보가 있다.

수업테이블에는 lec_cd가 있고 수업명과 교수 정보가 있다.

마지막으로 수강신청 테이블에는 수업코드인 lec_cd와 학생ID인 studentID로 이루어져 있다.

 

# 각 생성한 테이블 조회
View(students)
View(lecture)
View(lec_stu)

 

 

 

 

 

일반적으로 모든 기관의 DB에는 위와 같이 주제별로 데이터 테이블이 분산되어있으며

테이블간에 데이터를 조인할 때는 테이블 마다 공통적으로 가지고 있는 키값(Key value)을 이용한다. 

 

위 예시에서는 lec_cd와 studentID가 키값이며 이들을 가지고 데이터를 조인할 수 있다.

 

 

 

 

< 데이터 조인 >

R에는 자체적으로 merge라는 데이터 조인 함수가 있지만, dplyr 패키지가 가독성이나 처리 속도면에서 뛰어나기 때문에 dplyr 패키지의 join을 사용하는 것을 추천한다.

 

- inner join : 키값을 기준으로 양쪽 테이블에 모두 내용이 겹치는 레코드만 조인되는 방식. 가장 보편적으로 사용

- outer join(full join) : 키값을 기준으로 양쪽 테이블에 모두 내용이 겹치는 레코드 뿐만 아니라 한쪽에만 내용이 있어도 조인을 하고 빈 값은 null로 처리하는 조인방식

 

- left join : 키값을 왼쪽 테이블을 기준으로 조인하는 방식

- right join : 키값을 오른쪽 테이블을 기준으로 조인하는 방식

 

dplyr 패키지에서는 각각 inner_join, full_join, left_join, right_join 명령어로 조인을 구현 할 수 있다.

 

inner조인을 예로 들면 inner_join(테이블1, 테이블2, by=(키값)) 의 형태이다.

 

library(dplyr)

# 수강신청 테이블과 학생 테이블을 조인
inner_join(lec_stu, students, by=('studentID')) %>%
  View()

 

 

 

# 경영학과인 학생들만 수강과목을 조회
inner_join(students %>% filter(major == "경영학과"),
           lec_stu, by=('studentID') ) %>%
  View()

 

 

 

 

이중 삼중으로 데이터를 조인할 수도 있다.

 

# 수강신청 테이블과 학생 테이블을 조인한 뒤, 수업테이블과 조인
inner_join((inner_join(lec_stu, students, 
                       by=('studentID'))), 
           lecture, by=('lec_cd')) %>%
  View()