2014-11-24 2 views
4

배경이가입하고 추가 열

나는 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 

질문

  1. 그 일의 '가장 좋은'방법은 무엇입니까? 사용 된 시간과 메모리 측면에서 '최고'?
  2. 어떻게하는 것이 개념적 방법일까요? 다시 말해, Matt Dowle (패키지 관리자)의 일련의 명령은 무엇이 될까요?
  3. (2)이 예상대로 작동하는 동안 (1)이 작동하지 않는 이유는 무엇입니까? 여기
+0

우리는 항상 WWMDD에게 질문해야합니다. –

답변

3

현재 구현 문제를 (I 제대로 data.table 코드를 해석 한 것으로 가정) (1)

DT1[DT2[, lapply(.SD, mean), by = "id"], x := -x] # (1) 

당신은로 참여, x:=-x에 참조로 DT1을 수정하는 것입니다은 실제로 할당되지 않습니다.

은 당신이 원하는 것은 (4) 여기

DT3 <- DT1[DT2[, lapply(.SD, mean), by = "id"]][, x := -x] 

, 결합 된 데이터 세트에 [에 추가 호출하면 새로 만든 data.table에 x:=-x을 할당하는 것을 의미합니다.

정말로 필요한 경우가 아니면 명시 적 사본이 필요하지 않습니다.

+0

설명해 주셔서 감사합니다. 나는 그것이 참조에 의해 변화하는 슬롯과 관련이 있다고 가정하고 있었다. 궁금증에서 벗어나 : 케이스 (2)에서'data.table'도 복사됩니까? – thothal

+1

@thothal 새로운 데이터.테이블은 DT1 [DT2 [, lapply (.SD, mean), by = "id"]]'에 의해 생성되며, 복사하면이 새로운 데이터 테이블을 복사 할 것입니다. – mnel

2

내가 dplyr와 함께이 문제를 해결할 줄 방법은 다음과 같습니다

library("dplyr") 

set.seed(1) 
DT1 <- data_frame(id = LETTERS[1:4], x = rnorm(4), key = "id") 
DT2 <- data_frame(id = rep(LETTERS[1:4], each = 3), y = 1:12, z = rep(1, 12), key = "id") 

DT2 %>% 
    group_by(id) %>% 
    summarise_each(funs(mean), y:z) %>% 
    left_join(DT1) %>% 
    mutate(x = -x) 

+0

대안을 가져 주셔서 감사합니다. 사실, 그건 제 첫 번째 코드였습니다. 그러나 나는 단지 새로운 것을 배우기 위해'data.table' 옵션을 탐구하고 싶었다. – thothal