data.table 패키지 소개

대용량의 데이터를 분산 처리 시스템 없이 처리할 수 있는 data.table 데이터 구조와 이를 조작, 관리하는데 사용하는 data.table 패키지에 대해서 소개합니다.

R
rpackage
data.table
Author
Published

February 11, 2022

시작하기 전에

본 자료는 빠른 속도와 메모리 효율성에 강점이 있는 data.table 패키지에 관해 기본 개념과 문법, 함수들을 예제를 통해 다루어 볼 것이다.

1. 개념 소개

data.table 패키지는 대용량의 데이터를 분산 처리 시스템 없이 처리할 수 있는 방법으로, 데이터 프레임을 대신하여 더 빠르고 편리하게 사용할 수 있는 데이터 타입이다.

  • 장점- 상대적으로 메모리 요구량이 적고, 속도가 매우 빠르다.

  • 단점- 다소 난해한 문법으로 널리 사용되지는 못하고 있다.

2. 기본 문법

data.table 의 기본 문법은 DT[i, j, by] 형태이다.

  • i는 행을 선택힌다.
  • j는 열을 선택하거나 열 또는 테이블 전체에 함수를 적용한다.
  • by는 집단을 나눈다. j에서 지정한 열과 함수를 by 그룹 별로 수행한다.
  • 뒤에 [order]를 붙여 오름차순이나 내림차순으로 정렬할 수 있다.

Load & save data: fread & fwrite

fread 함수로 빠르게 csv 파일을 읽어와서 data.table 자료로 만들 수 있고, fwrite 함수로 csv 파일을 쓸 수 있다. freadfwrite 는 이름답게 매우 빠르며 Base R의 함수보다 40배 더 빠른 속도를 자랑한다. 파일을 읽어와서 data.table 자료로 만들 때, 로컬 file path를 입력하거나 http:// 로 시작하는 url을 입력하는 방법을 사용한다. fread로 파일을 읽으면 그 class는 data.framedata.table이 추가되며 문법이 원래의 data.frame과 달라지는 점을 유의하자.

fread를 통해 데이터를 불러와 data.table 형태로 만들어보자. 데이터는 09-15년 공단 건강검진 데이터에서 실습용으로 32명을 뽑은 자료이며, 자세한 내용은 “data/2교시 테이블 세부 레이아웃 소개(최신자료).pdf” 를 참고하자.

Setup

## Setup

# install.packages("data.table")
# install.packages("curl")

library(data.table)
library(curl)
Using libcurl 8.6.0 with LibreSSL/3.3.6

Load file

# Load file
url <- "https://raw.githubusercontent.com/jinseob2kim/lecture-snuhlab/master/data/example_g1e.csv"
df <- read.table(url,header=T)
dt <- fread(url,header=T)
# Class
print(class(df))
[1] "data.frame"
[1] "data.table" "data.frame"

dt의 class에 data.table이 추가된 것을 볼 수 있다.


# dt = data.table(df)
# df = data.frame(dt)
## See 
dt

Save file

# Save file
write.csv(dt, "aa.csv",row.names=F)
fwrite(dt, "aa.csv")

row operation

행을 선택하는 slice는 data.table에서 DT[c(row1, row2, …),] 또는 DT[c(row1, row2, …)]의 형식으로 data.frame과 동일하게 쓰인다.

dt[c(3,5)]


특정한 조건을 만족하는 행을 선택하는 filter는 data.table에서 DT[cond]의 형식으로 쓰인다.

(이때, cond는 논리형 벡터이다.)

dt[BMI>=30 & HGHT<150]

미리 key들을 지정하면 더 빠르게 검색할 수 있다. 자세한 내용은 뒤에서 다루도록 하겠다.

column operation

열을 이름 또는 순번으로 선택하는 select는 DT[, .(cols)] 또는 DT[, list(cols)]의 형식으로 data.frame과 비슷하나 몇 가지 차이점이 있다. 변수 이름으로 선택하는 경우 앞에 .()이나 list를 붙이지 않으면 결과로 벡터가 반환된다.

  • 순번으로 열 선택
dt[, c(13, 14)]


  • 이름으로 열 선택
## same
# dt[, list(HGHT, WGHT)]
dt[, .(HGHT, WGHT)]


열을 선택할 때 DT[, .(new_col = col)] 형식을 사용하여 열 이름을 지정해서 출력할 수 있다.

# rename
dt[, .(Height = HGHT, Weight = WGHT)]


  • 변수로 열 선택
## same
# vars <- c(13,14) 
vars <- c("HGHT", "WGHT")

dt[, ..vars]

변수로 열을 선택하는 경우, 변수 앞에 ..을 붙이지 않으면 오류가 발생하므로 주의하도록 한다. .. 대신 with = F 를 뒤에 붙이거나 .SD, .SDcols 옵션을 사용하기도 한다. .SD는 뒤에서 더 자세히 다루도록 하겠다.

dt[, vars, with = F]


  • 열 제외

필요없는 열을 제외할 때는 - 또는 ! 를 붙인다.

icols = c(1:12)

## same
# dt[, -..icols]
dt[, !..icols]