data.table reshape

Published onesixx on

R
예제 Data
R

Columns

Vectors 를 사용하여 column 선택

R
Extract specific column

. (dot)

특정 column만 select할때,   .( ) 를 활용
regression formulas에서 볼수 있었던 (ex. lm(y~., data=DT). 는”all other variables”을 의미하지만, 
data.table에서는 “list”를 의미한다.

R

Vector를 변수로 사용하여 column 선택

R

Subsetting column

.SD만 단순히 사용하면, 원래 값과 같다. 

R
   A B C D
1: a 1 1 3
2: a 2 6 6
3: b 3 5 4
4: b 1 3 2
5: c 2 4 1
6: c 3 2 5
R
   B
1: 1
2: 2
3: 3
4: 1
5: 2
6: 3

Self reference

.SD 와 .SDcols (Subset of Data columns)
.SD는 하나의 data.table의 columns을 각각 sub-data.table로 나누어 self reference할수 있게 해준다. 

A column와 B column을 paste하는 것을 .SD를 활용하여 같은 결과를 구현할수 있다.

R
[1] "a1" "a2" "b3" "b1" "c2" "c3

ROW

한 column에 조건을 사용하여 row subsetting

R

 sub-data.table의 ridx를 활용하여 원하는 row만 뽑아올수 있다. (각 그룹의 B열에서 max값을 갖는 row를 뽑아옴)

R
   A B C D
1: a 2 4 5
2: b 3 3 3
3: c 3 5 1
R
   A B
1: a 2
2: b 3
3: c 3

Special symbols

R

. .SD .SDcols .I .N .GRP .BY .EACHI
.SD.BY.N.I and .GRP are read only symbols for use in j. (.N can be used in i as well)

.I (row순번) .N (row 갯수)

R
[1] 1 2 3 4 5 6

   A V1
1: a  2
2: b  4
3: c  6

R
[1] 6

   A N
1: a 2
2: b 2
3: c 2

.GRP

R

.BY

R

 := 

 data.table’s reference semantics vignette 

update, data의 불필요한 Copy를 방지

Subsetting의 인덱싱 결과는 또 다른 새로운 data.table이다.(즉 원래 DT에 재할당하지 않는 이상, DT는 변하지 않고 유지된다) 따라서, DT의 size가 big한 경우,  := 를 사용하여 컬럼을 참조하여 update함으로써  data의 불필요한 Copy를 방지한다.

Column Type변환

R

여러 방법을 통해 out_idx를 정의하고, 해당 컬럼에 함수(as.factor)를 적용하여,  column type을 covert한다. 
data.table이 각 element가 column인 list로 여겨질수 있다는 것이다.  
(out_idx)를 괄호로 감싸는 이유는 컬럼명으로 인식하게 하기 위해. 

Data.Frame을 사용해서도 같은 결과를 얻을수 있다.

setDF(DT)                              # convert to data.frame for illustration 
sapply(DT[ ,out_idx], is.character)

lapply(.SD 활용

R
   A B C D
1: b 3 5 4
2: b 1 3 2
3: c 2 4 1

data.table에서는 colSums보다는 lapply(.SD,…) 을 많이 사용한다. cf. rowSums은 rowSums

R
결과가 data.table
    B  C  D
1: 12 21 21
R
결과가 numeric vector (EXCEPT A)
 B  C  D 
12 21 21 

.SD는 lapply에서 Column 기준으로 반복

R
   # 2nd row of each group
A B C D
1: a 2 6 6
2: b 1 3 2
3: c 3 2 5
# colSums of each group
A B C D
1: a 3 7 9
2: b 4 8 6
3: c 5 6 6
#
A B C D
1: FALSE TRUE TRUE TRUE

NA 처리

df는 Logical(T/F) matrix를 이용한 Indexing이 가능하지만, data.table은 다르다. (http://onesixx.com/indexing/ )

R
R
R
https://stackoverflow.com/questions/7235657/fastest-way-to-replace-nas-in-a-large-data-table
R

melt.data.table() & dcast.data.table()

reshape2 package의 함수를 data.table에 맞게 수정된 dcast & melt

data <- melt.data.table(data, id.vars = c(“A”, “B”, “C”))

recast <- dcast.data.table(result, wid ~ Param)

R
https://github.com/Rdatatable/data.table/wiki/Getting-started
https://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right
https://stackoverflow.com/questions/8508482/what-does-sd-stand-for-in-data-table-in-r
https://www.analyticsvidhya.com/blog/2016/05/data-table-data-frame-work-large-data-sets/
Use of lapply .SD in data.table R
HTML vignettes: https://github.com/Rdatatable/data.table/wiki/Getting-started

예제>

R
R
example(data.table)
Categories: Reshaping

onesixx

Blog Owner

Leave a Reply

Your email address will not be published.