데이터 분석에 앞서, 원 데이터셋을 쉽게 관리하고자 취합(Mash-Up)할 필요가 있습니다. R에서 기본적으로 제공하는 rbind(), cbind(), merge() 함수를 이용하여 취합할 수 있습니다. 특히, merge 함수의 경우에는 SQL 쿼리의 join 문법과 비슷합니다.   

 

25.1. 데이터셋의 물리적 행 결합, rbind()

더보기
더보기

데이터셋을 물리적으로 결합한다는 의미는 단순히 기워붙인다는 의미입니다. 물리적으로 결합하고자 할 때는 아래의 조건을 요구합니다.

 ①두 데이터셋의 구조가 동일해야함

 ②두 데이터셋의 적용하고자 하는 행(혹은 열)의 이름과 개수가 동일해야함

예시를 위해 이전 포스트인 <9. 데이터 구조 파악하기>의 데이터셋을 변형하여 1반, 2반 학생 데이터셋인 class_01_dataset, class_02_dataset을 정의하겠습니다. 

class_01_dataset <- data.frame(name = c("PSH", "CGE", "CSH", "CMJ", "CJH"),
                               gender = factor(c("m", "f", "m", "f", "m")),
                               korean = c(35, 92.5, 70, 85, 60),
                               math = c(65L, 80L, 88L, 67L, 28L),
                               test_pass = c(FALSE, TRUE, TRUE, TRUE, FALSE))
class_02_dataset <- data.frame(name = c("LSS", "PBH", "KSB", "MSH", "JYJ"),
                               gender = factor(c("m", "m", "m", "m", "f")),
                               korean = c(80, 95, 86, 75, 60),
                               math = c(68L, 80L, 96L, 65L, 85L),
                               test_pass = c(FALSE, TRUE, TRUE, FALSE, FALSE))

두 데이터셋을 행 기준으로 합치고자 한다면 다음의 과정을 행합니다.

student_dataset <- rbind(class_01_dataset, class_02_dataset)

 

25.2. 데이터셋의 물리적 열 결합, cbind()

더보기
더보기

예시를 위해 추가적인 정보(학생의 반 번호, 반 위치)를 부여할 class_info_dataset을 정의하겠습니다. 

class_info_dataset <- data.frame(
  class_num = c(01, 01, 01, 01, 01, 02, 02, 02, 02, 02),
  class_loc = c(rep("DJ", 5), rep("SU", 5))
)

student_dataset에 추가적인 정보(class_info_dataset)를 열로써 결합하고자 할 때는 다음과 같습니다.  

student_dataset <- cbind(student_dataset, class_info_dataset)

 

25.3. 데이터셋의 논리적 결합, merge()

더보기
더보기

(1) merge() 함수의 구조

merge() 함수는 데이터셋을 논리적으로 결합하는 함수입니다. 두 데이터셋의 기준이 되는 key 값을 바탕으로 결합하는데, 함수의 구조는 다음과 같습니다.

merge(x, y, by, all, ... )
 
파라미터 설명
x 데이터셋 1
y 데이터셋 2
by 결합 기준이 되는 열 지정, 'by.x'∙'by.y' 파라미터로 대신 사용 가능
all 공통된 값이 없을 때 처리 기준 정의, False일 경우 제외, True일 경우 NA 처리

 

(2) all 파라미터가 TRUE인 경우

예시를 위해 학급의 직업 정보가 존재하는 job_info_dataset을 정의하면 다음과 같습니다. job 변수의 WK는 근로자(WorKer), ST는 학생(STudent)를 의미합니다.

job_info_dataset <- data.frame(name = c("PSH", "CGE", "CSH", "LSS", "KSB"),
                               job = c("WK", "ST", "ST", "ST", "WK"))

job_info_dataset과 student_dataset을 name 열을 기준으로 병합할 때 all 파라미터를 FALSE로 정의할 경우 다음과 같습니다. 

student_dataset <- merge(student_dataset, job_info_dataset, by='name', all=TRUE)

처리 결과 job_info_dataset에 명시되지 않은 학생들은 NA(결측치) 처리됨을 확인할 수 있습니다. 

 

(3) all 파라미터가 FALSE인 경우 

student_dataset을 다시 정의한 후, job_info_dataset을 함께 결합할 때 all 파라미터를 FALSE로 정의할 경우, 

student_dataset <- merge(student_dataset, job_info_dataset, by="name", all=FALSE)

처리 결과를 살펴보면, job_info_dataset에서 명시된 학생들만 정의되고, 나머지 행들은 삭제됐음을 확인할 수 있습니다.