data.table Tip
Table of contents
Using thread
?getDTthreads
생략된 rows 보기
많지 않은 데이터 전체를 Console창에서 보고 싶을때, 가장 쉽게 View(데이터.테이블)
도 있지만,
옵션의 max.print를 늘리는 방법이 있다.
display entire row
Union

Shift
shift() example
https://www.rdocumentation.org/packages/data.table/versions/1.12.8/topics/shift
shift() vs. diff()
shift(x, n=1L, fill=NA, type=c("lag", "lead", "shift"), give.names=FALSE)
lapply(.SD 활용
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
B C D
1: 12 21 21
B C D
12 21 21
.SD는 lapply에서 Column 기준으로 반복
# 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/ )
remove NA rows
https://stackoverflow.com/questions/7235657/fastest-way-to-replace-nas-in-a-large-data-table
setDT() vs. as.data.table()
setDT()
typeof()가 list인 object를 data.table로 변환해 준다.
(vector나 column이 하나인 list, matrix, array는 에러난다. )
Copy없이 같은 list를 공유하면서 만들기 때문에 memory 주소가 같다. tracemem()
as.data.table()
Type 상관없이 data.table로 모두 변환해 준다
Copy해서 만들기 때문에 memory 주소가 다르다. tracemem()
Special symbols
. .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 갯수)
[1] 1 2 3 4 5 6
A V1
1: a 2
2: b 4
3: c 6
[1] 6
A N
1: a 2
2: b 2
3: c 2
.GRP
.BY
:=
data.table’s reference semantics vignette
update, data의 불필요한 Copy를 방지
Subsetting의 인덱싱 결과는 또 다른 새로운 data.table이다.(즉 원래 DT에 재할당하지 않는 이상, DT는 변하지 않고 유지된다) 따라서, DT의 size가 big한 경우, :=
를 사용하여 컬럼을 참조하여 update함으로써 data의 불필요한 Copy를 방지한다.
Column Type변환
여러 방법을 통해 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)