{sqldf} package는 R data frame에 SQL문을 사용하기 위한 package이다. 즉, SQL문을 사용하여 R의 data frame을 manipulation하는데 사용된다.
본 문서는 {sqldf} package를 사용하여 data frame에서 필요한 부분만 select하여 가져와서 본인이 원하는 data frame을 만드는 방법과 여러개의 data frame을 merge하는 방법에 대해서 설명하겠다.
csv 형식으로 저장되어 있는 파일을 R로 불러오는 내용의 코드이다. read.csv() function을 사용해서 데이터를 import 하였다.
bank <- read.csv("bank.dat", sep = ",", header = F)
etc <- read.csv("etc_delinquency.dat", sep = ",", header = F)
multi <- read.csv("multi_card.dat", sep = ",", header = F)
pers <- read.csv("personal.dat", sep = ",", header = F)
perf <- read.csv("Performance_Data.dat", sep = ",", header = F)
library(xtable)
print(xtable(head(perf, 10)), type = "html", include.rownames = F)
V1 | V2 | V3 | V4 |
---|---|---|---|
2601000001.00 | 200601 | 20060106 | Exclusion |
2601000002.00 | 200601 | 20060116 | Exclusion |
2601000003.00 | 200601 | 20060127 | Exclusion |
2601000004.00 | 200601 | 20060124 | Exclusion |
2601000005.00 | 200601 | 20060116 | Exclusion |
2601000006.00 | 200601 | 20060109 | Exclusion |
2601000007.00 | 200601 | 20060126 | Exclusion |
2601000008.00 | 200601 | 20060113 | Exclusion |
2601000009.00 | 200601 | 20060112 | Exclusion |
2601000010.00 | 200601 | 20060106 | Exclusion |
위에 보이는 output은 “perf” data frame의 일부분을 출력한 것이다.
5개의 data frame을 살펴 보면, 1~4번째 column은 같고 5번째 이후의 column들은 각 data frame마다 다르다. 때문에, 각 data frame마다 5번째 이후의 column을 'b1', 'b2', … 와 같은 형태로 바꾸고자 한다.
colnames(bank) <- paste("b", 1:63, sep = "")
# b1, b2, ..., b63까지 변수명 지정
colnames(bank)[c(1:2)] <- c("id", "date")
# 1,2 번째 column name을 id, date로 지정
colnames(etc) <- paste("e", 1:36, sep = "")
# c1, c2, ..., c36까지 변수명 지정
colnames(etc)[c(1:2)] <- c("id", "date")
# 1,2 번째 column name을 id, date로 지정
colnames(multi) <- paste("m", 1:42, sep = "")
# m1, m2, ..., m42까지 변수명 지정
colnames(multi)[c(1:2)] <- c("id", "date")
# 1,2 번째 column name을 id, date로 지정
colnames(pers) <- paste("p", 1:35, sep = "")
# p1, p2, ..., p35까지 변수명 지정
colnames(pers)[c(1:2)] <- c("id", "date")
# 1,2 번째 column name을 id, date로 지정
colnames(perf) <- c("id", "date", "date_ymd", "target")
R에서 SQL문을 사용하기 위해서는 {sqldf} package를 설치해야 한다.
설치를 위해서는
(i) install.packages(“sqldf”) 혹은, (ii) [Packages] - [Install Packages] - [sqldf]를 선택하여 설치하면 된다.
library(sqldf)
library(tcltk)
# library 'sqldf', 'tcltk'
이제 우리는 {sqldf} package에 있는 sqldf() function을 사용할 것이다. 아래에 4. 데이터 선택에서 사용할 sqldf() function에 대해 간략히 설명을 하면,
sqldf(“select * from data where column1 'expression1' and column2 'expression2' and … order by column”)
a. sqldf() function에서 () 안의 전체적인 표현은 Quatation mark(“”)안에 들어가야 한다.
b. select * : select all, 데이터 전체를 선택한다는 것이다. * 대신에 특정 column들을 지정할 수도 있다.
c. from data : 여기서 data는 SQL문을 사용할 data frame을 의미한다.
d. where 및 그 다음: where 이하는 조건을 걸어주는 것이다. column1, column2, …에는 data frame 안에 해당하는 column name을 넣어주면 되고, expression1, expression2, …에는 원하는 조건을 넣어주면 된다.
e. order by column : 정렬 기준을 지정하는 것이다.
“perf” data frame에서 'target' column에서 Exclusion에 해당하는 observation은 필요 없고 'id' column에서 끝에 자리수가 1인 observation만 필요하다.
아래의 code는 데이터의 필요한 부분을 Select하는 sqldf() function이다.
perf_2 <- sqldf("select * from perf where target in ('Good', 'Bad')\nand substr(id,10,1) == '1' order by id")
# 'perf' data frame으로부터 'target'이 Exclusion인 observation 제외 'id'의
# 끝에 자리수가 1인 observation만 필요
print(xtable(head(perf_2, 10)), type = "html", include.rownames = F)
id | date | date_ymd | target |
---|---|---|---|
2601000571.00 | 200601 | 20060113 | Good |
2601000621.00 | 200601 | 20060131 | Good |
2601000671.00 | 200601 | 20060110 | Good |
2601000731.00 | 200601 | 20060116 | Good |
2601000761.00 | 200601 | 20060110 | Good |
2601000771.00 | 200601 | 20060109 | Good |
2601000781.00 | 200601 | 20060116 | Good |
2601000791.00 | 200601 | 20060105 | Good |
2601001301.00 | 200601 | 20060126 | Good |
2601001361.00 | 200601 | 20060109 | Good |
위의 output은 1~10번째 observation만 우선 살펴 본 것이다.
이제 5개의 data frame을 하나의 data frame으로 합쳐야 한다.
그 전에, 여기에서 사용하는 sqldf() function에 대해 간략이 설명한다.
sqldf(“select * from data1 inner join data2 using (column1, column2) inner join … order by column”)
a. sqldf() function에서 () 안의 전체적인 표현은 Quatation mark(“”)안에 들어가야 한다.
b. data1, data2, … : 하나로 합칠 data frame을 의미한다.
c. join : join은 data frame들을 합치겠다는 것이다.
d. using() : ()안에 들어가는 column이 합치는데 기준이 된다.
e. order by column : 정렬 기준을 지정하는 것이다.
이제 그럼 아래의 code 와 output을 살펴보자.
final <- sqldf("select * from perf_2 join pers using (id, date)\njoin multi using (id, date) join etc using(id, date)\njoin bank using (id, date) order by id")
# 5개의 data frame을 id, data순으로 오름차순 정렬로 데이터를 합침.
print(xtable(head(final[, 1:22], 5)), type = "html", include.rownames = F)
id | date | date_ymd | target | p3 | p4 | p5 | p6 | p7 | p8 | p9 | p10 | p11 | p12 | p13 | p14 | p15 | p16 | p17 | p18 | p19 | p20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2601000571.00 | 200601 | 20060113 | Good | 1 | 20060118 | 20060113 | 0 | F | 69 | 5 | KEB | 413 | 1 | 1 | 0 | N614 | 413 | 1 | |||
2601000621.00 | 200601 | 20060131 | Good | 1 | 20060202 | 20060131 | 0 | M | 69 | 2 | KEB | 411 | 1 | 1 | 0 | N064 | 411 | 1 | |||
2601000671.00 | 200601 | 20060110 | Good | 1 | 20060113 | 20060110 | 0 | M | 69 | 5 | KEB | 540 | 1 | 1 | 1 | Z004 | 540 | 1 | |||
2601000731.00 | 200601 | 20060116 | Good | 1 | 20060120 | 20060116 | 0 | M | 68 | 1 | 2 | CCD | 463 | 1 | 1 | 0 | J012 | 137 | 1 | 1 | |
2601000761.00 | 200601 | 20060110 | Good | 1 | 20060113 | 20060110 | 0 | M | 68 | 1 | 5 | KEB | 403 | 1 | 1 | 0 | G155 | 420 | 1 | 1 |
# column이 매우 길기 때문에 'final' data frame의 22번째 column까지만 표시
위의 output은 column이 172개 정도 된다.한 줄에 다 보이기에는 많으므로 22번째 column까지만 출력하였다.
지금까지 {sqldf} package를 이용해서 데이터를 select하고 merge하는 방법에 대해 설명하였다.
Hankuk University of Foreign Studies. Dept of Statistics. Daewoo Choi Lab. Yong Cha.
한국외국어대학교 통계학과 최대우 교수 연구실 차용
e-mail : yong.stat@gmail.com