참조를 사용한 데이터 수정
‘3.7 객체의 불변성’ 절에서 R 객체는 수정되지 않으며, 값을 수정하는 것처럼 보이는 경우에도 실제로는 새로운 객체를 매번 만든다고 설명했다. 따라서 for 문 안에서의 데이터 수정은 매우 긴 시간이 소요되고 이런 이유로 벡터화된 연산을 사용해야 한다.
데이터 테이블은 데이터 프레임이 지원하는 일반적인 데이터 수정 연산자 외에도 := 연산자를 사용한 데이터 수정 기능을 제공한다(표 5-13 참고).
문법 |
의미 |
DT[i, LHS := RHS] |
LHS에 RHS를 참조로 할당한다. |
DT[i, c("LHS1", "LHS2") := list(RHS1, RHS2)] |
LHS1, LHS2에 RHS1, RHS2를 할당한다. |
다음은 데이터 프레임과 데이터 테이블을 각각 사용하여 for 문에서 첫 번째 컬럼에 1부터 1000까지의 값을 지정하는 예다. 이 예는 <데이터 테이블 참조 매뉴얼>[7]에서 인용했다.
> m <- matrix(1, nrow=1000, ncol=100) > DF <- as.data.frame(m) > DT <- as.data.table(m) > system.time({ + for (i in 1:1000) { + DF[i, 1] <- i + } + }) user system elapsed 0.64 0.01 0.67 > system.time({ + for(i in 1:1000) { + DT[i, V1 := i] + } + }) user system elapsed 0.53 0.00 0.53
위 결과에서 데이터 프레임은 0.67초가 소요된 반면 데이터 테이블은 0.53초가 소요되었다. 그러나 모든 경우 데이터 테이블의 참조 연산 방식이 데이터 프레임에 비해 우위에 있지는 않다. 예를 들어, 데이터의 다른 컬럼을 참조하는 연산의 경우 등에서는 데이터 프레임이 더 빠른 경우가 있으니 항상 속도를 직접 측정해보면서 적절한 방식을 택하길 바란다.