data.table의 개략적인 문법은 다음과 같다.
<그림>
i에는 행을 선택하는 문법이 들어가며, j에는 열을 선택하는 문법이 들어간다.
mult는 'JOIN'연산 시, 키 매칭의 처음, 마지막, 모두를 리턴하는 옵션을 의미한다.
nomatch는 'OUTER JOIN'을 사용할 때 주로 정해주는 옵션으로, 매칭되지 않을 경우에 리턴될 값을 명시할 때 사용한다.
roll은 조인 시 매칭되지 않은 곳에 어떤 값을 넣어야 할지 결정할 때 사용한다.
by는 'GROUP BY'연산을 할 때 사용하는 옵션으로 우리에게 필요한 옵션이다.
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 같은 변수도 여러개가 될 수 있다.
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내장 함수도 호출할 수 있다.
library(plyr)
library(ggplot2)
res <- ddply(market_price, .(M_TYPE_NAME, A_NAME), summarise, avg = mean(A_PRICE))
그림 한장으로 품목 간의 대략적인 가격 차이와 마켓 형태에 따른 가격 차이 추세를 볼 수 있다.