실전 업무에서 데이터베이스는 데이터 종류별로 테이블이 나뉘기 때문에 하나의 테이블에 필요한 데이터 모두 포함된 경우는 드물다.
이상적인 분석용 데이터를 만들기 위해서는 데이터 테이블을 결합하는 처리가 필요하다.
< 실습용 예제 데이터 생성 >
학생테이블, 수업테이블 그리고 수강 신청 테이블을 각각 생성한다.
# 학생테이블
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()
'R데이터전처리' 카테고리의 다른 글
[R-전처리] 데이터 집계함수(dplyr group_by 최빈값과 순위 계산) (0) | 2020.03.24 |
---|---|
[R-전처리] 데이터 집계 함수(dplyr group_by 그룹별 요약통계) (0) | 2020.03.23 |
[R-전처리] 데이터 집계 함수(dplyr group_by 카운트, 합계 ) (0) | 2020.03.20 |
[R-전처리] 데이터 프레임에서 ID에 기반한 샘플링(랜덤 추출) (0) | 2020.03.19 |
[R-전처리] 데이터 프레임에서 조건에 맞는 행 추출(dplyr filter) (0) | 2020.03.18 |