티스토리 뷰
Data Table(데이터 테이블)
데이터 테이블은 성능과 관련해서 중요한 개념입니다.
Table 구조의 데이터의 특정 컬럼별 주소값을 갖는 index를 생성하여 key를 통한 연산 및 검색을 빠르게 수행
데이터 색인 혹은 연산 시 인덱스를 설정한 테이블과 설정하지 않은 테이블의 성능 차이가 데이터가 방대해질 수록 커지기 때문에 대용량의 데이터 처리를 위해 인덱스는 필수! 입니다.
데이터 테이블(data table) : 인덱스(목차) 설정이 가능한 데이터 프레임
Key별로 가지고 있는 주소값을 통해 저장공간을 효율적으로 색인(인덱싱)할 수 있습니다.
데이터 테이블은 찾고자 하는 정보 기반으로 주소를 저장하기 때문에, 조건 연산 수행 시 가장 빠른 특징이 있습니다.
특히, key를 통한 조건 검색(색인), key를 통한 그룹 연산, key를 통한 정렬 에 빠른 성능을 가지고 있습니다.
> install.packages("data.table")
> library(data.table)
data.table::data.table(..., column = value, # 컬럼과 값 지정
stringsAsFactors = T) # 문자열 팩터 저장 여부
as.data.table(data) # 데이터 프레임을 데이터 테이블 형태로 변환
tables() # 생성된 테이블 정보
> iris_table <- as.data.table(iris)
> iris_table # 데이터 프레임과 다르게 행 번호가 key 형식입니다.
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 5.1 3.5 1.4 0.2 setosa
2: 4.9 3.0 1.4 0.2 setosa
3: 4.7 3.2 1.3 0.2 setosa
---
149: 6.2 3.4 5.4 2.3 virginica
150: 5.9 3.0 5.1 1.8 virginica
데이터 테이블(data table)의 색인
# 데이터 테이블의 색인 방법은 데이터 프레임 색인과 동일하게 적용
> iris_table[1,] # row 색인
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 5.1 3.5 1.4 0.2 setosa
> iris_table[,Species] # column 색인 (벡터로 출력)
[1] setosa setosa setosa setosa setosa setosa ....
> iris_table[,'Species'] # column 색인 (데이터 테이블로 출력)
Species
1: setosa
2: setosa
---
149: virginica
150: virginica
> iris_table[Sepal.Length > 3,]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 5.1 3.5 1.4 0.2 setosa
2: 4.9 3.0 1.4 0.2 setosa
---
149: 6.2 3.4 5.4 2.3 virginica
150: 5.9 3.0 5.1 1.8 virginica
> iris_table[,Species == 'setosa']
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE ....
데이터 테이블(data table)의 그룹 연산
# 그룹 연산 (세 번째 인자 by에 그룹지을 변수 설정, 여러개일 경우 계속 나열)
> iris_table[, mean(Sepal.Length), by = 'Species']
Species V1
1: setosa 5.006
2: versicolor 5.936
3: virginica 6.588
> iris_table[, mean(Sepal.Length), by = 'Species,Petal.Width']
Species Petal.Width V1
1: setosa 0.2 4.972414
2: setosa 0.4 5.300000
...
10: versicolor 1.6 6.100000
11: versicolor 1.0 5.414286
...
26: virginica 1.6 7.200000
27: virginica 1.4 6.100000
데이터 테이블(data table)의 Key 설정
data.table::setkey(x, # 데이터 테이블
...) # key로 사용할 컬럼
> setkey(iris_table, Species)
> tables()
NAME NROW NCOL MB COLS KEY
1: iris_table 150 5 0 Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species Species
Total: 0MB
Q.
### 1. table 생성
> iris_big <- c()
> for (i in 1:1000 ) {
iris_big <- rbind(iris_big, iris)
}
> nrow(iris_big)
[1] 300000
### 2. key 설정(중요)
> library(data.table)
> iris_big_table <- as.data.table(iris_big) # as.data.table 구조로 변경
> setkey(iris_big_table, Species) # Species 값별 주소를 갖는 index 저장(종별 색인 목적)
### 3. 속도 테스트
## 3-1) iris_big의 종별 평균 수행(data frame 구조)
> library(plyr)
> ddply(iris_big, .(Species), summarise, m1 = mean(Sepal.Length),
m2 = mean(Sepal.Width))
Species m1 m2
1 setosa 5.006 3.428
2 versicolor 5.936 2.770
3 virginica 6.588 2.974
> system.time(ddply(iris_big, .(Species), summarise, m1 = mean(Sepal.Length), # system.time 함수로 시간 측정
m2 = mean(Sepal.Width)))
사용자 시스템 elapsed
0.02 0.00 0.02
## 3-2) iris_big_table의 종별 평균 수행(table 구조)
> ddply(iris_big_table, .(Species), summarise, m1 = mean(Sepal.Length),
m2 = mean(Sepal.Width))
Species m1 m2
1 setosa 5.006 3.428
2 versicolor 5.936 2.770
3 virginica 6.588 2.974
> system.time(ddply(iris_big_table, .(Species), summarise, m1 = mean(Sepal.Length), # system.time 함수로 시간 측정
m2 = mean(Sepal.Width)))
사용자 시스템 elapsed
0.01 0.00 0.01
# 데이터가 방대하지 않아서 결과에 큰 차이는 없어 보이지만, 데이터가 커질 수록 성능 차이도 커진답니다 !!
참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'R > Process' 카테고리의 다른 글
[Python] DataFrame 생성 & data 삽입 (0) | 2019.05.21 |
---|---|
[R] 데이터들의 순위 출력 - rank (0) | 2019.01.13 |
[R] n번째 이전(이후) 행의 값 가져오기 - data.table::shift() (0) | 2019.01.12 |
[R] 데이터 내 NA를 이전 행의 값으로 치환하기 (0) | 2019.01.09 |
[R] 교차 테이블로 데이터 구조 변경하기 - melt, dcast 함수 (2) | 2019.01.08 |