끄적거림

data.table 패키지 유용하게 사용하기 2편 본문

R쓸신잡

data.table 패키지 유용하게 사용하기 2편

Signing 2020. 12. 8. 16:25
728x90
반응형

data.table 패키지 유용하게 사용하기 1편

 

data.table 패키지 유용하게 사용하기 1편

나는 원래 R 사용자였으며, 나름 학부시절 잘하는 쪽에 속한다고 생각했다. 그것이 가능했던 것이 data.table 패키지를 어느정도 잘 사용하고 나서부터라고 생각한다. 그동안 내가 알고 있던 꿀팁

signing.tistory.com


지난 번 포스팅 이후로 오랜만에 data.table package에 대해 남은 얘기를 해보도록 하겠다.

 

 

3. Channing

data.table 패키지는 chaining을 지원한다.

여기서 chaining이란 전 포스팅에서 봤던 조건, 연산, 그루핑 등을 연쇄적으로 붙여서 사용할 수 있음을 의미한다.

iris[Species == 'setosa'][Sepal.Width > 3]

이 chainning 무한히 연쇄시킬수 있고, 꼭 filtering으로만 사용하는 것이 아니라, 연산, grouping등으로도 사용할 수 있다.

 

iris.dt[Sepal.Width > 3][, .N, by = 'Species']

 

 

4. Merge

data.table 객체는 data.frame 객체보다 merge할때의 성능이 약 400배 정도 차이가 난다고 한다.

그 이유는 첫 번째 포스팅에서도 소개했듯이 key구조를 갖고 있기 때문이다.

 

 

 

 

5. Cons

위의 성질과 연산을 잘만 이용하면 웬만한 모든 핸들링은 다른 패키지를 사용하지 않고서도 모두 처리가 가능하며, 가장 좋은 것은 그 연산 속도가 엄청나다는 것이다.

 

하지만, 마냥 좋은 것 만은 아니다.

 

몇가지 단점들도 존재하는데, 그 중 내가 꼽은 단점은 다음과 같다.

 

 

1) pass-by-reference

data.table 객체는 아쉽게도 pass-by-reference의 성질을 가지고 있다.

pass-by-reference라는 것은 간단히 설명하면

아래 그림은 변수(객체) a를 새로 생성할 때 메모리에 어떻게 적재되는지를 살펴보는 그림으로 아래 코드를 실행하면 발생하는 과정이다.

a <- 10

메모리에 객체를 올리는 과정 1

 

메모리에 객체를 올리는 과정 2

그 다음 아래의 코드를 이용하여 b라는 객체를 생성하면 어떤일이 발생할까?

b <- a

메모리에 존재하던 객체를 참조

이 경우 두가지 상황이 발생한다.

 

하나는 객체 a 자체를 참조하는 경우, 다른 하나는 객체 a의 값만 참조하는 경우.

우리는 첫 번째 상황을 pass-by-reference, 두 번째 상황을 pass-by-value라고 말한다.

 

두 번째 상황의 경우는 크게 문제될 것이 없다.

첫 번째 상황의 경우는 데이터를 다룰 때 꽤나 신중해야한다.

왜냐하면 b를 수정하면 a도 같이 수정되기 때문이다. 한 마디로 연동되어 있다고 생각하면 된다.

iris.dt1 <- data.table(iris)
class(iris.dt1)
iris.dt2 <- iris.dt1
class(iris.dt2)

# > iris.dt1 <- data.table(iris)
# > class(iris.dt1)
# [1] "data.table" "data.frame"
# > iris.dt2 <- iris.dt1
# > class(iris.dt2)
# [1] "data.table" "data.frame"

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments