data.table reshape

Published by onesixx on

Special symbols

. .SD .SDcols .I .N .GRP .BY .EACHI

?"special-symbols"
R
예제 Data

Columns

. (dot)

R

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

R
Extract specific column

.. (dotdot)

R

.SD 와 .SDcols (select columns)

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

column subsetting

.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

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

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

ROW

variable name

R
R
R
R

.I (row Number) .N (number of rows)

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

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,…), rowSums은 rowSums

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

NA 처리

R
R
Error in `[.data.table`(`*tmp*`, , colNm) : 
  j (the 2nd argument inside [...]) is a single symbol but column name 'colNm' is not found. Perhaps you intended DT[,..colNm] or DT[,colNm,with=FALSE]. 
This difference to data.frame is deliberate and explained in FAQ 1.1.

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


.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

 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

예제>

R

.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)

Performance check 

# 10*6 data.table
DT <- replicate(6, sample(seq(100L),10,T)) %>% as.data.table
DT[ , LETTERS[1:2] := .(sample(100L,10,T), sample(100L,10,T))]

# 10000000 * 6  더 큰 데이터테이블 만들기
kk = seq(100L)
nn = 1e7
DT <- replicate(6, sample(kk,nn,T)) %>% as.data.table
DT[ , LETTERS[1:2]:=.(sample(kk,nn,T), sample(kk,nn,T))]

library(microbenchmark)
microbenchmark(times = 100L,
               colsums  = colSums(DT[ , !c("A", "B"), with = FALSE]),
               colsums2 = DT[ , colSums(.SD), .SDcols=!c("A", "B")],
               lapplys  = DT[ , lapply(.SD, sum), .SDcols = !c("A", "B")])
Unit: milliseconds
     expr       min        lq      mean    median        uq       max neval cld
  colsums 215.75608 216.39019 222.84491 216.99909 221.86177 395.47297   100   c
 colsums2 164.90262 165.44731 166.86141 165.72122 166.05506 181.50616   100  b 
  lapplys  36.02945  36.82467  37.44593  37.20621  37.45793  48.53117   100 a 

dcast.data.table() , melt.data.table() 

Convert DT to long form where each dob is a separate observation.

These functions are sourced from reshape2 package and make them efficient.
It also add some new features.

R

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

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

rs <-dcast.data.table(rs,”Step~variable”)

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
example(data.table)
Categories: Reshaping

onesixx

Blog Owner

Leave a Reply

Your email address will not be published.