[14-02-10]

3.6 data.table 패키지

market_price <- read.csv("C:/Users/Byeongsoo/Documents/R/requisites.csv")
library(data.table)
market_price.dt <- data.table(market_price)
market_price.dt[2, list(M_NAME)]
##          M_NAME
## 1: 서울중앙시장

market_price를 data.table로 변환해주었고, 변환된 객체에서 두번째 행의 M_NAME열의 데이터를 가져오는 코드이다.

market_price[2, "M_NAME", drop = F]
##         M_NAME
## 2 서울중앙시장

drop = F를 사용한 이유에 대해 알아보자.
data.frame은 한 열을 리턴할 때는 벡터로, 두개 이상의 열을 리턴할 때는 data.frame으로 리턴해서 종종 불편할 때가 있다. 그 때 drop = F를 사용하면 무조건 data.frame으로 반환한다.
data.table은 리스트로 열을 입력받게 하여 모든 경우에 data.table로 리턴한다.

market_price.dt[, list(avg = mean(A_PRICE)), by = list(M_TYPE_NAME, A_NAME)]
##      M_TYPE_NAME              A_NAME  avg
##   1:    전통시장    사과(부사, 300g) 2524
##   2:    전통시장      배(신고, 600g) 3099
##   3:    전통시장       배추(2.5~3kg) 2724
##   4:    전통시장             무(1kg) 1415
##   5:    전통시장       양파(1.5kg망) 2209
##  ---                                     
## 126:    전통시장              오징어 1660
## 127:    대형마트 고등어(냉동,수입산) 1500
## 128:    대형마트              고등어 1000
## 129:    전통시장 고등어(생물,수입산) 1500
## 130:    대형마트 오징어(생물,수입산) 1680

M_TYPE_NAME과 A_NAME으로 'GROUP BY'된 각각의 data.table에 avg라는 열을 입력해, A_PRICE의 평균값을 넣는 연산이다.
by에 여러개가 들어갈 수 있으며, 연산을 통해 만들어지는 avg 같은 변수도 여러개가 될 수 있다.

sqldf를 활용한 방법을 간단하게 살펴보자

library(sqldf)
## Loading required package: DBI
## Loading required package: gsubfn
## Loading required package: proto
## Loading required namespace: tcltk
## Loading required package: chron
## Loading required package: RSQLite
## Loading required package: RSQLite.extfuns
sqldf("select M_TYPE_NAME, A_NAME, avg(A_PRICE) as avg\n      from market_price group by M_TYPE_NAME, A_NAME limit 10")
## Loading required package: tcltk
##    M_TYPE_NAME                A_NAME    avg
## 1     대형마트                고등어 1000.0
## 2     대형마트     고등어(30cm,국산) 5335.0
## 3     대형마트     고등어(냉동,국산) 2825.0
## 4     대형마트   고등어(냉동,수입산) 1500.0
## 5     대형마트     고등어(생물,국산) 4550.5
## 6     대형마트 냉동참조기(20cm,국산)  824.7
## 7     대형마트                  달걀 2472.5
## 8     대형마트            달걀(왕란) 2614.3
## 9     대형마트            달걀(특란) 2130.0
## 10    대형마트                닭고기 6573.5

sqldf는 data.frame을 흡사 데이터베이스의 테이블 처럼 여긴다.
sqldf()안에서 대부분의 SQL 쿼리를 수행할 수 있다. avg 같은 SQL내장 함수도 호출할 수 있다.

3.7 멍잉을 왜 할까?

library(plyr)
library(ggplot2)
res <- ddply(market_price, .(M_TYPE_NAME, A_NAME), summarise, avg = mean(A_PRICE))

그림 한장으로 품목 간의 대략적인 가격 차이와 마켓 형태에 따른 가격 차이 추세를 볼 수 있다.