배경이가입하고 추가 열
나는 data.table
라이브러리에 상당히 새로운 현재 효율적으로 사용할 수 배우고 간다. 내가 가지고있는 것은 두 개의 테이블이며 두 번째 테이블을 먼저 집계 한 다음 첫 번째 테이블과 병합하고 조인 된 테이블의 열을 수정하려고합니다. 이상적으로 (그리고 내 이해를 위해) 한 번에.
패키지 버전
sessionInfo()
# R version 3.1.0 (2014-04-10)
# Platform: i386-w64-mingw32/i386 (32-bit)
# attached base packages:
# [1] stats graphics grDevices utils datasets methods base
# other attached packages:
# [1] data.table_1.9.4
# loaded via a namespace (and not attached):
# [1] chron_2.3-45 plyr_1.8.1 Rcpp_0.11.2 reshape2_1.4 stringr_0.6.2
# [6] tools_3.1.0
코드
나는이 최소한의 예에서 볼 수있는 시도 무엇 :
library(data.table)
set.seed(1)
DT1 <- data.table(id = LETTERS[1:4], x = rnorm(4), key = "id")
DT2 <- data.table(id = rep(LETTERS[1:4], each = 3), y = 1:12, z = rep(1, 12), key = "id")
DT1[DT2[, lapply(.SD, mean), by = "id"]] # simple join works fine
# id x y z
# 1: A -0.6264538 2 1
# 2: B 0.1836433 5 1
# 3: C -0.8356286 8 1
# 4: D 1.5952808 11 1
# however, adding a 'j' argument does not work
DT1[DT2[, lapply(.SD, mean), by = "id"], x := -x] # (1)
# in fact the above statement changes the 'x' column in 'DT1':
DT1
# id x
# 1: A 0.6264538
# 2: B -0.1836433
# 3: C 0.8356286
# 4: D -1.5952808
나는이 함께 할 수있는 뭔가가 생각 똑똑한 방법 data.table
데이터를 처리하는 방법 (그리고 복사본을 만들지 않습니다 필요한 경우를 제외하고는 참조로 부름). 따라서, 다음 코드는 작동 :
DT3 <- copy(DT1[DT2[, lapply(.SD, mean), by = "id"]])[, x := -x]
(DT4 <- DT1[DT2[, lapply(.SD, mean), by = "id"]][, x := -x]) # (2)
# id x y z
# 1: A -0.6264538 2 1
# 2: B 0.1836433 5 1
# 3: C -0.8356286 8 1
# 4: D 1.5952808 11 1
identical(DT3, DT4)
# [1] TRUE
질문
- 그 일의 '가장 좋은'방법은 무엇입니까? 사용 된 시간과 메모리 측면에서 '최고'?
- 어떻게하는 것이 개념적 방법일까요? 다시 말해, Matt Dowle (패키지 관리자)의 일련의 명령은 무엇이 될까요?
(2)
이 예상대로 작동하는 동안(1)
이 작동하지 않는 이유는 무엇입니까? 여기
우리는 항상 WWMDD에게 질문해야합니다. –